{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "b8208ce6-8333-4421-9e2d-c59b094e511b",
   "metadata": {},
   "outputs": [],
   "source": [
    "var openDigger = require('../src/open_digger')\n",
    "var query = q => openDigger.driver.clickhouse.query(q, { format: 'JSONEachRow' });"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45c01716-fb94-48f1-9891-2e2401c3e029",
   "metadata": {},
   "source": [
    "# Clickhouse demo (Update at 2022.12.15)\n",
    "\n",
    "This notebook is a comprehensive Clickhouse database demo to show how to use Clickhouse instance to analyze GitHub event data.\n",
    "\n",
    "The content is from \"Milovidov A., 2020. Everything You Ever Wanted To Know About GitHub (But Were Afraid To Ask), https://ghe.clickhouse.tech/\"."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0fb58a78-a4bd-48f1-b627-9f1a7b7bce2f",
   "metadata": {},
   "source": [
    "## Counting stars\n",
    "\n",
    "The `WatchEvent` is the event when someone gives a star to a repo."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "f873a476-7e9d-4c5c-a479-d2cad5313192",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────────────┐\n",
      "│ (index) │ total_count │\n",
      "├─────────┼─────────────┤\n",
      "│    0    │ '314168026' │\n",
      "└─────────┴─────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT COUNT() AS total_count\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent'\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7bec10b9-9b9d-4728-9a35-d314cee67689",
   "metadata": {},
   "source": [
    "> There is no events when someone removes the star. This means that star removal is invisible, but it should be rare in any case, so we can calculate the approximate number of stars from these events.\n",
    "> \n",
    "> Pay attention, the star counting here is incorrect because of the following reasons:\n",
    "> \n",
    "> - The stars before 1/1/2015 are not counted by 'WatchEvent' because the data source GH Archive did not start recording Event API until 1/1/2015.\n",
    "> - Some stars are removed or re-stared several times so it may lead to missing stars or duplicated stars.\n",
    "> - `repo_name` may have been changed across the data.\n",
    "> \n",
    "> So, our suggestions are:\n",
    "> \n",
    "> - Use Github API to fetch the real-time star count.\n",
    "> - Use `repo_id` instead of `repo_name` as the indexes of analysis.\n",
    "\n",
    "There are over 300 million stars on GitHub!\n",
    "\n",
    "Let's validate the star count by comparing it for Clickhosue repository:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "6596ca22-ae7c-4ed7-88b3-818ba1b6d6fc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬──────────────────┐\n",
      "│ (index) │ clickhouse_stars │\n",
      "├─────────┼──────────────────┤\n",
      "│    0    │     '28005'      │\n",
      "└─────────┴──────────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT COUNT() AS clickhouse_stars\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent' AND repo_name IN ('ClickHouse/ClickHouse', 'yandex/ClickHouse')\n",
    "GROUP BY action\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "82a53bda-4b7d-46ec-b605-03a65da16ada",
   "metadata": {},
   "source": [
    "The number looks consistent with the real star count.\n",
    "\n",
    "> The repository was moved from yandex/ClickHouse to ClickHouse/ClickHouse on October 2019, so we have to sum up the numbers for two repos."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "37f346af-b016-435b-a0fe-d31356af3a7c",
   "metadata": {},
   "source": [
    "## Top repositories by stars\n",
    "\n",
    "This is the first report that comes to mind."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c04d9917-f339-4437-b216-5c59bc824afe",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬──────────────────────────────────────────┬──────────┐\n",
      "│ (index) │                repo_name                 │  stars   │\n",
      "├─────────┼──────────────────────────────────────────┼──────────┤\n",
      "│    0    │             '996icu/996.ICU'             │ '273033' │\n",
      "│    1    │          'sindresorhus/awesome'          │ '249365' │\n",
      "│    2    │    'kamranahmedse/developer-roadmap'     │ '238267' │\n",
      "│    3    │               'vuejs/vue'                │ '232950' │\n",
      "│    4    │  'jwasham/coding-interview-university'   │ '226860' │\n",
      "│    5    │       'FreeCodeCamp/FreeCodeCamp'        │ '224460' │\n",
      "│    6    │             'facebook/react'             │ '224437' │\n",
      "│    7    │    'donnemartin/system-design-primer'    │ '213766' │\n",
      "│    8    │         'tensorflow/tensorflow'          │ '198006' │\n",
      "│    9    │       'freeCodeCamp/freeCodeCamp'        │ '189985' │\n",
      "│   10    │ 'EbookFoundation/free-programming-books' │ '189249' │\n",
      "│   11    │        'public-apis/public-apis'         │ '171752' │\n",
      "│   12    │        'getify/You-Dont-Know-JS'         │ '169952' │\n",
      "│   13    │            'flutter/flutter'             │ '166097' │\n",
      "│   14    │     'trekhleb/javascript-algorithms'     │ '163274' │\n",
      "│   15    │          'TheAlgorithms/Python'          │ '163123' │\n",
      "│   16    │          'vinta/awesome-python'          │ '154893' │\n",
      "│   17    │             'torvalds/linux'             │ '148222' │\n",
      "│   18    │       'jackfrued/Python-100-Days'        │ '145135' │\n",
      "│   19    │    'danistefanovic/build-your-own-x'     │ '143228' │\n",
      "└─────────┴──────────────────────────────────────────┴──────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, COUNT() AS stars\n",
    "FROM gh_events WHERE type = 'WatchEvent'\n",
    "GROUP BY repo_name\n",
    "ORDER BY stars DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "94fdac2c-edaf-4f22-9dd7-2419cd4c66a7",
   "metadata": {},
   "source": [
    "The top repository ever is \"996.ICU\" — it's not for software, but more like a project to improve awareness about work schedules in different Chinese companies. But wait... it's not the top repo. We see two copies of \"FreeCodeCamp\": FreeCodeCamp/FreeCodeCamp and freeCodeCamp/freeCodeCamp. If we sum up the stars it will be 224460 + 176141 = 400601 — more than \"996.ICU\". So, the top repository on GitHub is an educational resource.\n",
    "\n",
    "Next we see: JavaScript framework, then Machine Learning framework, then another JavaScript framework, then the list of Awesome Awesomeness, then the JavaScript education resources, then another education project, another education project, UI framework, education, education, UI framework, JS something, CSS framework and finally in 17th place there is Linux. Let's stop at this point.\n",
    "\n",
    "Bottomline: GitHub is full of JavaScript frameworks and education content. But don't jump to conclusions yet — we've only scratched the surface!"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ba095aeb-7474-4e2a-ac00-d0c162a19389",
   "metadata": {},
   "source": [
    "## Distribution of repositories by star count\n",
    "\n",
    "By the way, what is the distribution of repositories by stars?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5ab1be24-eaef-44b9-9f81-163449ebf29b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬────────┬────────────┐\n",
      "│ (index) │ stars  │ repo_count │\n",
      "├─────────┼────────┼────────────┤\n",
      "│    0    │   1    │ '23145966' │\n",
      "│    1    │   10   │ '1622539'  │\n",
      "│    2    │  100   │  '274097'  │\n",
      "│    3    │  1000  │  '36846'   │\n",
      "│    4    │ 10000  │   '2576'   │\n",
      "│    5    │ 100000 │    '33'    │\n",
      "└─────────┴────────┴────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`SELECT exp10(floor(log10(c))) AS stars, uniq(name) AS repo_count\n",
    "FROM\n",
    "(\n",
    "    SELECT\n",
    "        repo_name AS name,\n",
    "        COUNT() AS c\n",
    "    FROM gh_events\n",
    "    WHERE type = 'WatchEvent'\n",
    "    GROUP BY name\n",
    ")\n",
    "GROUP BY stars\n",
    "ORDER BY stars\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fbce29bc-8c31-4569-83fe-23dc88ef5391",
   "metadata": {},
   "source": [
    "There are only 23 million repositories that have at least one star. There are only 1.6 million repositories with 10+ stars. Just 274 thousand repositories have over 100 stars, 36,846 have over 1k stars, 2,576 have over 10k stars and there are only 33 repositories with more than 100k stars."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e013476a-98f8-40ec-ad22-21a625d5b7d5",
   "metadata": {},
   "source": [
    "## The total number of reposioties on GitHub"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "4d2e430a-acf1-4852-bfe0-b944b508b4c2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────────────┐\n",
      "│ (index) │ total_repo  │\n",
      "├─────────┼─────────────┤\n",
      "│    0    │ '269846507' │\n",
      "└─────────┴─────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT uniq(repo_name) AS total_repo\n",
    "FROM gh_events\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c64781b-737a-42d7-9b3f-1333d7559925",
   "metadata": {},
   "source": [
    "If we will take all stars and distribute uniformly across all the repositories, every repository will get 1.16 stars."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5b5d37de-85e3-4019-b9ce-5cd424a733b8",
   "metadata": {},
   "source": [
    "## How has the list of top repositories changed over the years?\n",
    "\n",
    "We will look at the data from 2015 to 2021."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "ee1fbdb8-b44b-4259-8c0d-61b83ab68b6b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬──────┬──────────────────────────────────────────────────┬──────────┐\n",
      "│ (index) │ year │                    repo_name                     │  stars   │\n",
      "├─────────┼──────┼──────────────────────────────────────────────────┼──────────┤\n",
      "│    0    │ 2015 │           'FreeCodeCamp/FreeCodeCamp'            │ '38362'  │\n",
      "│    1    │ 2015 │             'facebook/react-native'              │ '25337'  │\n",
      "│    2    │ 2015 │              'sindresorhus/awesome'              │ '24361'  │\n",
      "│    3    │ 2015 │                  'apple/swift'                   │ '23193'  │\n",
      "│    4    │ 2015 │                 'facebook/react'                 │ '22924'  │\n",
      "│    5    │ 2015 │         'jlevy/the-art-of-command-line'          │ '21722'  │\n",
      "│    6    │ 2015 │             'NARKOZ/hacker-scripts'              │ '20093'  │\n",
      "│    7    │ 2015 │                 'twbs/bootstrap'                 │ '19488'  │\n",
      "│    8    │ 2015 │          'google/material-design-lite'           │ '17684'  │\n",
      "│    9    │ 2015 │               'airbnb/javascript'                │ '17539'  │\n",
      "│   10    │ 2015 │                  'nvbn/thefuck'                  │ '17048'  │\n",
      "│   11    │ 2015 │           'vhf/free-programming-books'           │ '16893'  │\n",
      "│   12    │ 2015 │            'getify/You-Dont-Know-JS'             │ '16377'  │\n",
      "│   13    │ 2015 │                 'atom/electron'                  │ '16134'  │\n",
      "│   14    │ 2015 │             'tensorflow/tensorflow'              │ '15604'  │\n",
      "│   15    │ 2015 │           'FreeCodeCamp/freecodecamp'            │ '15243'  │\n",
      "│   16    │ 2015 │               'angular/angular.js'               │ '14802'  │\n",
      "│   17    │ 2015 │                    'nylas/N1'                    │ '14706'  │\n",
      "│   18    │ 2015 │                   'atom/atom'                    │ '13698'  │\n",
      "│   19    │ 2015 │                  'mbostock/d3'                   │ '13489'  │\n",
      "│   20    │ 2016 │           'FreeCodeCamp/FreeCodeCamp'            │ '181317' │\n",
      "│   21    │ 2016 │      'jwasham/google-interview-university'       │ '31149'  │\n",
      "│   22    │ 2016 │           'vhf/free-programming-books'           │ '28798'  │\n",
      "│   23    │ 2016 │                   'vuejs/vue'                    │ '28768'  │\n",
      "│   24    │ 2016 │             'tensorflow/tensorflow'              │ '28248'  │\n",
      "│   25    │ 2016 │                 'facebook/react'                 │ '25977'  │\n",
      "│   26    │ 2016 │            'getify/You-Dont-Know-JS'             │ '24941'  │\n",
      "│   27    │ 2016 │              'sindresorhus/awesome'              │ '24796'  │\n",
      "│   28    │ 2016 │             'chrislgarry/Apollo-11'              │ '23012'  │\n",
      "│   29    │ 2016 │                  'yarnpkg/yarn'                  │ '20668'  │\n",
      "│   30    │ 2016 │             'facebook/react-native'              │ '19750'  │\n",
      "│   31    │ 2016 │                 'twbs/bootstrap'                 │ '19345'  │\n",
      "│   32    │ 2016 │               'airbnb/javascript'                │ '18996'  │\n",
      "│   33    │ 2016 │                'joshbuchea/HEAD'                 │ '18360'  │\n",
      "│   34    │ 2016 │       'facebookincubator/create-react-app'       │ '18083'  │\n",
      "│   35    │ 2016 │                'firehol/netdata'                 │ '17751'  │\n",
      "│   36    │ 2016 │             'robbyrussell/oh-my-zsh'             │ '17351'  │\n",
      "│   37    │ 2016 │   'FallibleInc/security-guide-for-developers'    │ '15672'  │\n",
      "│   38    │ 2016 │                'github/gitignore'                │ '15193'  │\n",
      "│   39    │ 2016 │               'electron/electron'                │ '15124'  │\n",
      "│   40    │ 2017 │           'freeCodeCamp/freeCodeCamp'            │ '90681'  │\n",
      "│   41    │ 2017 │             'tensorflow/tensorflow'              │ '49208'  │\n",
      "│   42    │ 2017 │                   'vuejs/vue'                    │ '47984'  │\n",
      "│   43    │ 2017 │                 'facebook/react'                 │ '34454'  │\n",
      "│   44    │ 2017 │      'mr-mig/every-programmer-should-know'       │ '30416'  │\n",
      "│   45    │ 2017 │        'kamranahmedse/developer-roadmap'         │ '30392'  │\n",
      "│   46    │ 2017 │              'sindresorhus/awesome'              │ '29042'  │\n",
      "│   47    │ 2017 │            'getify/You-Dont-Know-JS'             │ '28881'  │\n",
      "│   48    │ 2017 │        'thedaviddias/Front-End-Checklist'        │ '24592'  │\n",
      "│   49    │ 2017 │       'facebookincubator/create-react-app'       │ '24451'  │\n",
      "│   50    │ 2017 │                'Microsoft/vscode'                │ '23486'  │\n",
      "│   51    │ 2017 │        'donnemartin/system-design-primer'        │ '22423'  │\n",
      "│   52    │ 2017 │             'GoogleChrome/puppeteer'             │ '22166'  │\n",
      "│   53    │ 2017 │               'airbnb/javascript'                │ '22098'  │\n",
      "│   54    │ 2017 │ 'sdmg15/Best-websites-a-programmer-should-visit' │ '21500'  │\n",
      "│   55    │ 2017 │      'jwasham/coding-interview-university'       │ '21317'  │\n",
      "│   56    │ 2017 │                 'twbs/bootstrap'                 │ '21108'  │\n",
      "│   57    │ 2017 │             'toddmotto/public-apis'              │ '20823'  │\n",
      "│   58    │ 2017 │             'robbyrussell/oh-my-zsh'             │ '19312'  │\n",
      "│   59    │ 2017 │    'kamranahmedse/design-patterns-for-humans'    │ '19270'  │\n",
      "│   60    │ 2018 │                   'vuejs/vue'                    │ '51129'  │\n",
      "│   61    │ 2018 │         'trekhleb/javascript-algorithms'         │ '38910'  │\n",
      "│   62    │ 2018 │                 'facebook/react'                 │ '38420'  │\n",
      "│   63    │ 2018 │                'flutter/flutter'                 │ '37948'  │\n",
      "│   64    │ 2018 │        'danistefanovic/build-your-own-x'         │ '37407'  │\n",
      "│   65    │ 2018 │             'tensorflow/tensorflow'              │ '36935'  │\n",
      "│   66    │ 2018 │        'kamranahmedse/developer-roadmap'         │ '35215'  │\n",
      "│   67    │ 2018 │        'donnemartin/system-design-primer'        │ '31196'  │\n",
      "│   68    │ 2018 │           'CyC2018/Interview-Notebook'           │ '29851'  │\n",
      "│   69    │ 2018 │                'Microsoft/vscode'                │ '26194'  │\n",
      "│   70    │ 2018 │             'kelseyhightower/nocode'             │ '26091'  │\n",
      "│   71    │ 2018 │        'xingshaocheng/architect-awesome'         │ '25594'  │\n",
      "│   72    │ 2018 │              'sindresorhus/awesome'              │ '24959'  │\n",
      "│   73    │ 2018 │                    'ry/deno'                     │ '22423'  │\n",
      "│   74    │ 2018 │            'getify/You-Dont-Know-JS'             │ '21990'  │\n",
      "│   75    │ 2018 │               'tensorflow/models'                │ '21488'  │\n",
      "│   76    │ 2018 │             'GoogleChrome/puppeteer'             │ '21115'  │\n",
      "│   77    │ 2018 │           'leonardomso/33-js-concepts'           │ '20828'  │\n",
      "│   78    │ 2018 │           'facebook/create-react-app'            │ '20288'  │\n",
      "│   79    │ 2018 │                  'axios/axios'                   │ '20071'  │\n",
      "│   80    │ 2019 │                 '996icu/996.ICU'                 │ '244343' │\n",
      "│   81    │ 2019 │           'jackfrued/Python-100-Days'            │ '76268'  │\n",
      "│   82    │ 2019 │              'Snailclimb/JavaGuide'              │ '53285'  │\n",
      "│   83    │ 2019 │              'TheAlgorithms/Python'              │ '48563'  │\n",
      "│   84    │ 2019 │                'CyC2018/CS-Notes'                │ '46527'  │\n",
      "│   85    │ 2019 │          'MisterBooo/LeetCodeAnimation'          │ '41415'  │\n",
      "│   86    │ 2019 │                   'vuejs/vue'                    │ '38958'  │\n",
      "│   87    │ 2019 │                'flutter/flutter'                 │ '38610'  │\n",
      "│   88    │ 2019 │              'doocs/advanced-java'               │ '35247'  │\n",
      "│   89    │ 2019 │               'microsoft/Terminal'               │ '31733'  │\n",
      "│   90    │ 2019 │        'kamranahmedse/developer-roadmap'         │ '30790'  │\n",
      "│   91    │ 2019 │         'jlevy/the-art-of-command-line'          │ '30680'  │\n",
      "│   92    │ 2019 │                'M4cs/BabySploit'                 │ '29352'  │\n",
      "│   93    │ 2019 │                 'facebook/react'                 │ '28908'  │\n",
      "│   94    │ 2019 │        'donnemartin/system-design-primer'        │ '26993'  │\n",
      "│   95    │ 2019 │             'tensorflow/tensorflow'              │ '26985'  │\n",
      "│   96    │ 2019 │                'macrozheng/mall'                 │ '26321'  │\n",
      "│   97    │ 2019 │              'sindresorhus/awesome'              │ '26250'  │\n",
      "│   98    │ 2019 │              'testerSunshine/12306'              │ '26200'  │\n",
      "│   99    │ 2019 │             'azl397985856/leetcode'              │ '25690'  │\n",
      "│   100   │ 2020 │          'labuladong/fucking-algorithm'          │ '81496'  │\n",
      "│   101   │ 2020 │      'jwasham/coding-interview-university'       │ '63016'  │\n",
      "│   102   │ 2020 │        'kamranahmedse/developer-roadmap'         │ '54210'  │\n",
      "│   103   │ 2020 │            'public-apis/public-apis'             │ '40584'  │\n",
      "│   104   │ 2020 │        'donnemartin/system-design-primer'        │ '40353'  │\n",
      "│   105   │ 2020 │     'EbookFoundation/free-programming-books'     │ '39990'  │\n",
      "│   106   │ 2020 │              'TheAlgorithms/Python'              │ '36471'  │\n",
      "│   107   │ 2020 │        'danistefanovic/build-your-own-x'         │ '36424'  │\n",
      "│   108   │ 2020 │                'CyC2018/CS-Notes'                │ '35335'  │\n",
      "│   109   │ 2020 │              'microsoft/PowerToys'               │ '35277'  │\n",
      "│   110   │ 2020 │         'trekhleb/javascript-algorithms'         │ '34985'  │\n",
      "│   111   │ 2020 │                'flutter/flutter'                 │ '33083'  │\n",
      "│   112   │ 2020 │              'Snailclimb/JavaGuide'              │ '32766'  │\n",
      "│   113   │ 2020 │                 'denoland/deno'                  │ '32702'  │\n",
      "│   114   │ 2020 │              'sindresorhus/awesome'              │ '30552'  │\n",
      "│   115   │ 2020 │                   'vuejs/vue'                    │ '28935'  │\n",
      "│   116   │ 2020 │              'ytdl-org/youtube-dl'               │ '28861'  │\n",
      "│   117   │ 2020 │             'florinpop17/app-ideas'              │ '28817'  │\n",
      "│   118   │ 2020 │           'jackfrued/Python-100-Days'            │ '27985'  │\n",
      "│   119   │ 2020 │            'CSSEGISandData/COVID-19'             │ '26920'  │\n",
      "│   120   │ 2021 │            'public-apis/public-apis'             │ '69498'  │\n",
      "│   121   │ 2021 │      'jwasham/coding-interview-university'       │ '55955'  │\n",
      "│   122   │ 2021 │     'EbookFoundation/free-programming-books'     │ '50631'  │\n",
      "│   123   │ 2021 │        'kamranahmedse/developer-roadmap'         │ '45129'  │\n",
      "│   124   │ 2021 │        'donnemartin/system-design-primer'        │ '41809'  │\n",
      "│   125   │ 2021 │         'trekhleb/javascript-algorithms'         │ '41664'  │\n",
      "│   126   │ 2021 │        'danistefanovic/build-your-own-x'         │ '36814'  │\n",
      "│   127   │ 2021 │              'sindresorhus/awesome'              │ '35549'  │\n",
      "│   128   │ 2021 │             'ossu/computer-science'              │ '33657'  │\n",
      "│   129   │ 2021 │              'TheAlgorithms/Python'              │ '31967'  │\n",
      "│   130   │ 2021 │        'microsoft/Web-Dev-For-Beginners'         │ '30902'  │\n",
      "│   131   │ 2021 │                'flutter/flutter'                 │ '30458'  │\n",
      "│   132   │ 2021 │           'microsoft/ML-For-Beginners'           │ '29376'  │\n",
      "│   133   │ 2021 │                'CyC2018/CS-Notes'                │ '29069'  │\n",
      "│   134   │ 2021 │         '30-seconds/30-seconds-of-code'          │ '26281'  │\n",
      "│   135   │ 2021 │             'ant-design/ant-design'              │ '24622'  │\n",
      "│   136   │ 2021 │          'labuladong/fucking-algorithm'          │ '24330'  │\n",
      "│   137   │ 2021 │           'freeCodeCamp/freeCodeCamp'            │ '24310'  │\n",
      "│   138   │ 2021 │                 'facebook/react'                 │ '23260'  │\n",
      "│   139   │ 2021 │              'Snailclimb/JavaGuide'              │ '23250'  │\n",
      "└─────────┴──────┴──────────────────────────────────────────────────┴──────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT toYear(created_at) AS year, repo_name, COUNT() AS stars\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent' AND year <= 2021\n",
    "GROUP BY repo_name, year\n",
    "ORDER BY year, stars DESC\n",
    "LIMIT 20 BY year\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f5590db6-b319-4288-9f6b-d9d0250bde95",
   "metadata": {},
   "source": [
    "Looks into the data in 2020, the top repo is a Chinese educational resource to prepare for an algorithms interview. Actually, amost all of the top 10 are related to education. The only exceptions are: Deno — a JS runtime and CSSEGISandData/COVID-19 — a repo for COVID-19 data. Yes, I expected that 2020 would be about COVID-19 but happily enough it's not only about COVID-19."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "6a406405-efbb-4aa0-b96c-c8cea97fcdf8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.plotly.v1+json": {
       "data": [
        {
         "name": "996icu/996.icu",
         "visible": "legendonly",
         "y": [
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          97017,
          129210,
          7297,
          2334,
          1977,
          1518,
          1124,
          1019,
          1354,
          1493,
          872,
          559,
          853,
          884,
          1044,
          721,
          1018,
          1146,
          1155,
          782,
          782,
          911,
          2463,
          701,
          1091,
          902,
          760,
          833,
          688,
          731,
          640,
          420,
          652,
          710,
          702,
          771,
          754,
          773,
          639,
          578,
          835,
          661,
          548,
          504,
          456,
          151
         ]
        },
        {
         "name": "donnemartin/system-design-primer",
         "y": [
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          14257,
          2344,
          779,
          697,
          709,
          647,
          901,
          797,
          726,
          566,
          859,
          1082,
          1270,
          830,
          785,
          671,
          10704,
          6456,
          4045,
          1700,
          1511,
          1283,
          1914,
          1898,
          2787,
          1915,
          1800,
          4598,
          1927,
          2230,
          2049,
          1755,
          1868,
          2252,
          2668,
          2425,
          2406,
          7018,
          5209,
          2755,
          2915,
          2498,
          3082,
          2711,
          3279,
          3387,
          3423,
          2877,
          2842,
          4121,
          4496,
          3995,
          3077,
          2749,
          3267,
          1246,
          4293,
          5423,
          4090,
          3951,
          5044,
          9115,
          4488,
          3189,
          5619,
          4095,
          3965,
          3312,
          2971,
          1153
         ]
        },
        {
         "name": "ebookfoundation/free-programming-books",
         "y": [
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          2485,
          1936,
          2793,
          2950,
          2130,
          1541,
          1473,
          1875,
          1449,
          1580,
          1452,
          1472,
          1875,
          1482,
          1755,
          1237,
          1516,
          1295,
          1124,
          1468,
          1232,
          2696,
          2184,
          1751,
          1432,
          1776,
          1660,
          1908,
          1414,
          2299,
          2020,
          2239,
          1660,
          2017,
          7156,
          4151,
          3321,
          2101,
          3546,
          2724,
          3848,
          3325,
          3902,
          3693,
          5058,
          3672,
          5147,
          4831,
          4467,
          3786,
          3841,
          5771,
          1342,
          3547,
          5476,
          3060,
          2691,
          6465,
          3283,
          2490,
          3394,
          5669,
          4052,
          3777,
          3139,
          4152,
          1196
         ]
        },
        {
         "name": "facebook/react",
         "y": [
          1792,
          2782,
          2400,
          2058,
          1657,
          1492,
          1681,
          1577,
          1790,
          1940,
          1857,
          1898,
          2028,
          1686,
          2422,
          2206,
          1794,
          1816,
          2159,
          2071,
          2778,
          2514,
          2374,
          2129,
          3014,
          2828,
          2990,
          2654,
          2757,
          2715,
          2975,
          2676,
          3111,
          3252,
          2894,
          2588,
          3155,
          2423,
          3366,
          2738,
          2682,
          8826,
          2845,
          2693,
          2578,
          2374,
          2544,
          2196,
          2667,
          2612,
          3209,
          2915,
          2757,
          2127,
          2311,
          2129,
          2061,
          2124,
          2055,
          1941,
          1831,
          1821,
          2026,
          2278,
          2454,
          2120,
          2545,
          2286,
          2129,
          2127,
          2095,
          2070,
          2118,
          1879,
          2345,
          2000,
          1893,
          2004,
          2100,
          2004,
          2048,
          790,
          1925,
          2154,
          2283,
          1783,
          3178,
          2404,
          2103,
          2125,
          2042,
          2571,
          1769,
          1910,
          1761,
          783
         ]
        },
        {
         "name": "freecodecamp/freecodecamp",
         "y": [
          55,
          37,
          36,
          29,
          59,
          1191,
          10637,
          6186,
          3731,
          7807,
          11098,
          12739,
          17260,
          19092,
          16645,
          16157,
          17995,
          20294,
          10347,
          10121,
          11320,
          13203,
          14379,
          14504,
          15403,
          14025,
          14616,
          14961,
          16767,
          13768,
          1195,
          1203,
          921,
          1193,
          1039,
          936,
          1033,
          926,
          1210,
          951,
          854,
          1062,
          1581,
          1270,
          1034,
          2418,
          1044,
          982,
          1155,
          1127,
          2910,
          3306,
          1607,
          1081,
          1216,
          1053,
          1186,
          1246,
          1787,
          1234,
          1136,
          1091,
          1194,
          1556,
          1619,
          1301,
          1607,
          1506,
          1486,
          1665,
          1243,
          1491,
          1495,
          2528,
          1631,
          1604,
          1581,
          1358,
          2330,
          2144,
          3994,
          1166,
          2329,
          2150,
          2459,
          2005,
          2268,
          1968,
          2318,
          1868,
          2630,
          2164,
          2329,
          2489,
          1705,
          623
         ]
        },
        {
         "name": "jwasham/coding-interview-university",
         "y": [
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          54,
          3038,
          4450,
          1517,
          982,
          1124,
          1071,
          1036,
          1202,
          1031,
          5812,
          1831,
          1609,
          1530,
          2302,
          2336,
          1384,
          1085,
          1165,
          1331,
          1275,
          1013,
          1371,
          1103,
          1056,
          1456,
          1271,
          1412,
          1192,
          4262,
          5646,
          2272,
          1969,
          2429,
          1451,
          1987,
          3276,
          4496,
          6970,
          8298,
          4288,
          5536,
          6333,
          3848,
          5813,
          2849,
          9322,
          2924,
          1692,
          2686,
          9104,
          8617,
          10144,
          6954,
          2026,
          3784,
          1001,
          3442,
          3581,
          4022,
          5441,
          5240,
          3288,
          2965,
          2007,
          4866,
          4144,
          4203,
          2244,
          3595,
          806
         ]
        },
        {
         "name": "kamranahmedse/developer-roadmap",
         "y": [
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          13885,
          5939,
          3244,
          1565,
          1075,
          1190,
          1113,
          961,
          777,
          643,
          9577,
          4914,
          2260,
          3229,
          1710,
          1683,
          2148,
          2038,
          1612,
          2799,
          1613,
          1632,
          6680,
          4040,
          2842,
          3149,
          2092,
          1812,
          2037,
          1878,
          1527,
          1376,
          1722,
          1635,
          2542,
          2096,
          2257,
          8179,
          4462,
          3035,
          5158,
          4933,
          5811,
          6637,
          5027,
          4073,
          6731,
          3680,
          3277,
          5192,
          4002,
          3449,
          3323,
          2876,
          3548,
          1221,
          2749,
          5081,
          3593,
          2510,
          3291,
          3723,
          2518,
          2719,
          5397,
          5630,
          4590,
          3755,
          3379,
          1426
         ]
        },
        {
         "name": "sindresorhus/awesome",
         "y": [
          420,
          263,
          297,
          359,
          6773,
          2686,
          1137,
          2878,
          2305,
          2865,
          2009,
          2369,
          2589,
          2502,
          2288,
          1635,
          1666,
          1625,
          2017,
          2339,
          2316,
          2030,
          1757,
          2032,
          3096,
          2991,
          2441,
          1963,
          1836,
          2056,
          1889,
          2129,
          1966,
          2180,
          4240,
          2255,
          2896,
          2005,
          2966,
          2143,
          1968,
          2261,
          1696,
          1838,
          1649,
          2000,
          1905,
          1632,
          2075,
          2007,
          2767,
          2523,
          2119,
          2130,
          2219,
          2099,
          1893,
          1984,
          1983,
          2451,
          2797,
          2255,
          3369,
          2280,
          2353,
          2094,
          1991,
          2177,
          2186,
          1992,
          4359,
          2699,
          1974,
          2752,
          2245,
          3994,
          2665,
          3250,
          1801,
          1519,
          2761,
          2139,
          4449,
          6000,
          5795,
          4224,
          5185,
          4531,
          4611,
          3980,
          6054,
          5334,
          4754,
          3301,
          4276,
          1811
         ]
        },
        {
         "name": "tensorflow/tensorflow",
         "y": [
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          13674,
          1930,
          2160,
          1491,
          1734,
          2290,
          2771,
          2203,
          1997,
          2038,
          2358,
          3030,
          2841,
          3335,
          3879,
          5153,
          4420,
          3632,
          3822,
          3522,
          3486,
          3584,
          3394,
          4313,
          5215,
          4788,
          4225,
          3355,
          4406,
          3588,
          3530,
          2828,
          2745,
          2402,
          2546,
          2595,
          2516,
          2199,
          2271,
          2074,
          3452,
          2819,
          2616,
          1909,
          2212,
          1852,
          2062,
          2008,
          2057,
          1653,
          1368,
          1284,
          1603,
          1636,
          1693,
          1407,
          1500,
          1294,
          1256,
          1212,
          1611,
          1450,
          1238,
          1036,
          1251,
          1354,
          1060,
          1156,
          1120,
          1132,
          965,
          450,
          1018,
          999,
          1365,
          872,
          1062,
          913,
          1030,
          917,
          877,
          961,
          835,
          869,
          893,
          339
         ]
        },
        {
         "name": "vuejs/vue",
         "y": [
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          1373,
          1559,
          1646,
          1710,
          1039,
          1416,
          2158,
          2184,
          1843,
          2215,
          2454,
          3002,
          3974,
          3488,
          3285,
          4091,
          4472,
          4609,
          3747,
          3807,
          3695,
          4181,
          3959,
          4228,
          4009,
          3668,
          3518,
          4644,
          3321,
          4587,
          3939,
          3674,
          10930,
          4026,
          3761,
          2995,
          2838,
          3233,
          3181,
          3464,
          2944,
          5548,
          4290,
          3588,
          3176,
          3222,
          2799,
          2291,
          2821,
          2418,
          2397,
          1847,
          2296,
          3050,
          3254,
          2568,
          2424,
          2717,
          2457,
          2669,
          1862,
          1852,
          1939,
          1848,
          1530,
          1699,
          1911,
          1547,
          1492,
          1697,
          1492,
          1640,
          599,
          1426,
          1526,
          1456,
          1067,
          1650,
          1224,
          1340,
          1285,
          1401,
          1224,
          1134,
          1093,
          919,
          398
         ]
        }
       ],
       "layout": {
        "autosize": true,
        "title": {
         "text": "Star trend for most starred repos on GitHub"
        },
        "xaxis": {
         "autorange": true,
         "range": [
          0,
          95
         ]
        },
        "yaxis": {
         "autorange": true,
         "range": [
          -1127.4444444444446,
          21421.444444444445
         ],
         "type": "linear"
        }
       }
      },
      "image/png": "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kxMLZgIBCEAAAhDISkC/xOuXeQmDLbbYwlq2bOlkgjLhvv/+e/f/W265xY0xceJEO++889wv/PrFv1htRd03n+fLR6CK5+jRo+3AAw902YbKQJW8rlmzZj63rNTX3nTTTfbkk086idSuXbuCPIuyAyWhW7VqZTfeeGNBxizmIAjUYtI2u/766+3ZZ591N91yyy2dKNXXwTlz5tgbb7zh3uBo1KiRPfjgg+6a++67z30NHDhwoLVt29Zlo5a33j7//HN3nd5ouvTSS5d7sOeee86uu+46O/TQQyNlkSJQi7tWuBsEIAABCEAgFAEEaiiyjAsBCEAAAhAoIAH/S369evXs3nvvdVtTU5uym5RxNWzYMPfhFSUyC3VflSnItSxBrtf66/IRqGeddZa9//77Lus3nXkBwxt5qFyfPfINzKwUBGq+HCuLQM33ueKsk1z75jund999184991wnTC+55BLbfPPNl7nVn3/+6b4mKlNaf2dqCNRco8N1EIAABCAAAQiURwCBytqAAAQgAAEIVAICyr5SFtYOO+xg55xzTtYZf/jhhzZ8+HD77rvvbI011rB11lnHXd++fXs79thjXTah6vJpW6nKAuga1QI94ogjrHXr1mVjK/Py1VdfdZmss2bNcluWFyxYYIcccoh17tx5uTlUdN+KxlNmpzLHVJ/Uz32rrbayQYMGWe3atd39fv31VzvttNOsQ4cObs7KONPcJDe1hfeoo45aRrxKrtx6661u7kuWLHE1Y1U3cebMmRVu4b/66qtd7VPNa6ONNnL315bzM844w/178uTJdtttt7ksONVZ1DXa3r/BBhtEZqiOH330kd18883Wt29fV4pBc1DNW42vZ1933XXt9ttvd8LoP//5j9tWf/bZZ9umm266TExymZ8y90aOHOnuofUgSaUt6bvttpvtuuuurgyEGP/000/uPj4O++67r22//fblrkNlRGt7u+agOapOqNbW/vvv7zKl9RzaOi1uLVq0cOMohmKuZ73iiitMtWpVO1L89cbB7rvv7jKBV1111eXWgsZ9/PHHHTvVxLzooovcGJqHXgsS4O+9956rm6n13LBhQ1dDWFvCP/jgA7c2dA9lKWp9r7LKKmXPJi7Kvp0yZYrLdFxvvfVMNTb9M2bbwp+6XjPNUTcRh3/9619uTWp8xVfruGvXrsuto6OPPtq9diX1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aZtttpmddNJJTl6pTZo0yWU3/vDDD7bFFlvYgQceaO3atXOfO+SQQ6xLly72+uuvm17n2223ne2xxx523XXX2fz5822bbbZxYylbdPHixXbyySfb999/7/qus846duaZZ1rr1q3LxpIUViak5tyiRQuXcbrGGmu4P7vvvrt16tTJzj//fFMi2CqrrOLur235uv+iRYtsp512shNOOMFq1Pi/nTZPPvmkPfroo/bggw+6++jv0aNHO3716tWzo48+2pUEuOWWW+zmm28uKw/w2muv2ciRI+22224zlQC48sorbebMmU7cbrrppk7sHnbYYe55GjZsaFWqVLEzzjjD2rdvbw899JA99thjrtyAMigPOuggW3vtte3pp5+2N9980z2PSjDUrl3bxentt9922/Br1aplRx11lItVtvbWW285xvIHGvebb74py0BV9qY+J456LmVy7rPPPo6JeEokK5aaQ69evezYY4+1Z5991t5//33HVu2NN94wZaVq/PXWW8+tKT2vykVUtF4yzVt91GbPnu3W77rrrmsXXXSRrb/++i7Ww4YNs9NPP90eeOABF8d7773XsRVPsVZ/cdcaVQw0D33uzjvvtA8//NCJ3xNPPLFsLWntqY/G1j369etnu+yyS8Z1pntvuOGG+b4cK+31CNQYoSMDNQa8AF0RqAGgRhwSgRoRXKBuCNRAYCMMi0CNAC1gl3SB2m34OJuz6GebdcVuy931pFEf2DMfzrc7BmxlPds0Djir0hwagZqsuCNQkxUPBGpy4oFAzTEWPy00e/fOHC8u8GU9zl5uQNWn3H///Z1wk1hStqOE3n777ecEqrZe33PPPSYBKaEm6SepJ/E5depUJ6ckKvfdd1+TiL3vvvuc4NO29oEDBzpxevDBB9tGG23kxJlEqfroWm2h1727detmL730kr3yyitOxEoYSvRJQuq++j54zTXXONF16KGH2gYbbGBXXHGFDRgwwAk8fR2QuNTYq6++upuvxKQkpZqXhttvv701adLEZYtKbmle2pquj2mMU0891V588UV3H/WRJBYTyUIxOeecc6x79+5lDDU3yTM9wwcffOCk7Wmnneakmf6v14Tm16dPHzvuuOPc32oSq2ImDvq4hK0E8JIlS+zxxx83lQUQj1tvvdUuvPBCJ6FbtWrlBOmNN97oxHGzZs3s9ttvd8L74osv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"
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "query(`\n",
    "SELECT\n",
    "    repo AS name,\n",
    "    groupArrayInsertAt(toUInt32(c), toUInt64(dateDiff('month', toDate('2015-01-01'), month))) AS data\n",
    "FROM\n",
    "(\n",
    "    SELECT\n",
    "        lower(repo_name) AS repo,\n",
    "        toStartOfMonth(created_at) AS month,\n",
    "        count() AS c\n",
    "    FROM gh_events\n",
    "    WHERE type = 'WatchEvent' AND repo IN\n",
    "    (\n",
    "        SELECT lower(repo_name) AS repo\n",
    "        FROM gh_events\n",
    "        WHERE type = 'WatchEvent'\n",
    "        GROUP BY repo\n",
    "        ORDER BY count() DESC\n",
    "        LIMIT 10\n",
    "    )\n",
    "    GROUP BY\n",
    "        repo,\n",
    "        month\n",
    ")\n",
    "GROUP BY repo\n",
    "ORDER BY repo ASC\n",
    "`).then(data => {\n",
    "    openDigger.render.plotly(data.map(row => {\n",
    "        return {\n",
    "            y: row.data,\n",
    "            name: row.name,\n",
    "        }\n",
    "    }), { title: 'Star trend for most starred repos on GitHub' });\n",
    "});"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ca057827-a022-4638-ae48-7a1c207d0118",
   "metadata": {},
   "source": [
    "## How has the total number of stars changed over time?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "29f99941-0014-4bf1-ad9f-16886f98bf19",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬──────┬────────────┬──────────────┐\n",
      "│ (index) │ year │   stars    │     bar      │\n",
      "├─────────┼──────┼────────────┼──────────────┤\n",
      "│    0    │ 2015 │ '18950116' │    '███▋'    │\n",
      "│    1    │ 2016 │ '26125809' │   '█████▏'   │\n",
      "│    2    │ 2017 │ '32596796' │  '██████▌'   │\n",
      "│    3    │ 2018 │ '36964092' │  '███████▍'  │\n",
      "│    4    │ 2019 │ '45898177' │ '█████████▏' │\n",
      "│    5    │ 2020 │ '49356912' │ '█████████▋' │\n",
      "│    6    │ 2021 │ '50020755' │ '██████████' │\n",
      "│    7    │ 2022 │ '54255369' │ '██████████' │\n",
      "└─────────┴──────┴────────────┴──────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT toYear(created_at) AS year, count() AS stars, bar(stars, 0, 50000000, 10) AS bar\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent'\n",
    "GROUP BY year\n",
    "ORDER BY year\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "56dedaaa-734a-4454-8458-fce971bb2245",
   "metadata": {},
   "source": [
    "We see just steady linear growth with a YoY rate of about 25%."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "06b8797d-091d-45f4-b332-86a25b6888d6",
   "metadata": {},
   "source": [
    "## Who are all those people giving stars?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "cabc8e84-a0f2-4948-bebd-894893d9f07e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬───────────────────┬──────────┐\n",
      "│ (index) │    actor_login    │  stars   │\n",
      "├─────────┼───────────────────┼──────────┤\n",
      "│    0    │      'italy'      │ '264778' │\n",
      "│    1    │      '4148'       │ '232489' │\n",
      "│    2    │    'daweedkob'    │ '215744' │\n",
      "│    3    │     'salifm'      │ '202516' │\n",
      "│    4    │ 'aplus-developer' │ '134089' │\n",
      "│    5    │  'CodePromoter'   │ '133102' │\n",
      "│    6    │    'dinosoid'     │ '119101' │\n",
      "│    7    │    'alineai18'    │ '111976' │\n",
      "│    8    │    'fly51fly'     │ '90615'  │\n",
      "│    9    │     'x0rzkov'     │ '74165'  │\n",
      "│   10    │      'gkze'       │ '73206'  │\n",
      "│   11    │     '5l1v3r1'     │ '72744'  │\n",
      "│   12    │   'gauravssnl'    │ '56691'  │\n",
      "│   13    │  'romanofficial'  │ '54139'  │\n",
      "│   14    │ 'nikitavoloboev'  │ '52967'  │\n",
      "│   15    │     'esneko'      │ '52202'  │\n",
      "│   16    │     'trippup'     │ '51903'  │\n",
      "│   17    │      'baslr'      │ '50270'  │\n",
      "│   18    │       'ik5'       │ '48215'  │\n",
      "│   19    │  'thanhtoan1196'  │ '48107'  │\n",
      "└─────────┴───────────────────┴──────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT actor_login, COUNT() AS stars\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent'\n",
    "GROUP BY actor_login\n",
    "ORDER BY stars DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "65f01272-276c-4703-925f-b3e405977a15",
   "metadata": {},
   "source": [
    "I checked the results: `italy` looks like an empty account... very suspicious.\n",
    "\n",
    "In comparison, I only gave 41 stars:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "e1ca32a2-88aa-46fa-bed5-a4fb7588da61",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────────────┬───────┐\n",
      "│ (index) │ actor_login │ stars │\n",
      "├─────────┼─────────────┼───────┤\n",
      "│    0    │ 'frank-zsy' │ '41'  │\n",
      "└─────────┴─────────────┴───────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT actor_login, COUNT() AS stars\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent' AND actor_login = 'frank-zsy'\n",
    "GROUP BY actor_login\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e0d2771e-161e-4338-b1ff-508b8cd51494",
   "metadata": {},
   "source": [
    "And here are my favorites storted by the total number of stars:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "b87447cd-274b-4521-99c2-b6a52b888a2b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬───────────────────────────────────┬──────────┐\n",
      "│ (index) │             repo_name             │  stars   │\n",
      "├─────────┼───────────────────────────────────┼──────────┤\n",
      "│    0    │     'getify/You-Dont-Know-JS'     │ '169952' │\n",
      "│    1    │    'resume/resume.github.com'     │ '66750'  │\n",
      "│    2    │        'huihut/interview'         │ '28777'  │\n",
      "│    3    │        'docsifyjs/docsify'        │ '16730'  │\n",
      "│    4    │        'thunlp/GNNPapers'         │ '14690'  │\n",
      "│    5    │           'neo4j/neo4j'           │ '10292'  │\n",
      "│    6    │         'sogou/workflow'          │ '10151'  │\n",
      "│    7    │     'sxei/chrome-plugin-demo'     │  '7103'  │\n",
      "│    8    │       'wuhan2020/wuhan2020'       │  '7043'  │\n",
      "│    9    │        'answerdev/answer'         │  '4209'  │\n",
      "│   10    │      'ByteLegend/ByteLegend'      │  '3598'  │\n",
      "│   11    │         'actions/runner'          │  '3499'  │\n",
      "│   12    │        'thunlp/NRLPapers'         │  '2715'  │\n",
      "│   13    │       'alibaba/GraphScope'        │  '2199'  │\n",
      "│   14    │            'anvaka/pm'            │  '1420'  │\n",
      "│   15    │ 'Serverless-Devs/Serverless-Devs' │  '1273'  │\n",
      "│   16    │         'alibaba/sealer'          │  '1082'  │\n",
      "│   17    │   'git-learning-game/oh-my-git'   │  '1037'  │\n",
      "│   18    │          'engula/engula'          │  '669'   │\n",
      "│   19    │       'pingcap/ossinsight'        │  '630'   │\n",
      "└─────────┴───────────────────────────────────┴──────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, COUNT() AS stars\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent' AND repo_name IN (\n",
    "    SELECT repo_name\n",
    "    FROM gh_events\n",
    "    WHERE type = 'WatchEvent' AND actor_login = 'frank-zsy'\n",
    ")\n",
    "GROUP BY repo_name\n",
    "ORDER BY stars DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6acc4b95-1615-4044-8b2c-ab8c439719b3",
   "metadata": {},
   "source": [
    "## Repository affinity list\n",
    "\n",
    "A quick question I'm eager to ask: what are the top repositories sorted by the number of stars from people who starred the ClickHouse reposiotry?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "3444bbf8-4f05-474c-b45a-fa649164d519",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬────────────────────────────────────┬────────┐\n",
      "│ (index) │             repo_name              │ stars  │\n",
      "├─────────┼────────────────────────────────────┼────────┤\n",
      "│    0    │ 'donnemartin/system-design-primer' │ '8362' │\n",
      "│    1    │      'tensorflow/tensorflow'       │ '8246' │\n",
      "│    2    │            'golang/go'             │ '7549' │\n",
      "│    3    │      'kubernetes/kubernetes'       │ '7432' │\n",
      "│    4    │       'sindresorhus/awesome'       │ '7270' │\n",
      "│    5    │           'pingcap/tidb'           │ '7089' │\n",
      "│    6    │      'prometheus/prometheus'       │ '6828' │\n",
      "│    7    │         'flutter/flutter'          │ '6411' │\n",
      "│    8    │        'avelino/awesome-go'        │ '6335' │\n",
      "│    9    │         'grafana/grafana'          │ '6306' │\n",
      "│   10    │      'ant-design/ant-design'       │ '6166' │\n",
      "│   11    │          'gin-gonic/gin'           │ '6161' │\n",
      "│   12    │            'vuejs/vue'             │ '6133' │\n",
      "│   13    │           'minio/minio'            │ '6035' │\n",
      "│   14    │  'jlevy/the-art-of-command-line'   │ '5659' │\n",
      "│   15    │          'facebook/react'          │ '5649' │\n",
      "│   16    │ 'kamranahmedse/developer-roadmap'  │ '5587' │\n",
      "│   17    │           'istio/istio'            │ '5412' │\n",
      "│   18    │          'torvalds/linux'          │ '5399' │\n",
      "│   19    │ 'danistefanovic/build-your-own-x'  │ '5387' │\n",
      "└─────────┴────────────────────────────────────┴────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, COUNT() AS stars\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent' AND actor_login IN (\n",
    "    SELECT actor_login\n",
    "    FROM gh_events\n",
    "    WHERE type = 'WatchEvent' AND repo_name IN ('ClickHouse/ClickHouse', 'yandex/ClickHouse')\n",
    ") AND repo_name NOT IN ('ClickHouse/ClickHouse', 'yandex/ClickHouse')\n",
    "GROUP BY repo_name\n",
    "ORDER BY stars DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "427a8a61-bac7-4e38-8db1-01fe869f6cc9",
   "metadata": {},
   "source": [
    "It's Tensorflow and TiDB. Yes, ClickHouse is friends with TiDB (they are using the ClickHouse engin under the hood for analytical queries). Then golang, prometheus and kubernetes. The overall list is slightly biased towards data-intensive applications: database engines, distributed filesystems, data orcestration, etc."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "64960ed2-949c-42d6-8bca-2fb2a92d04bd",
   "metadata": {},
   "source": [
    "## Finding friends through counting stars\n",
    "\n",
    "Let me find a friend by the intersection on starred repositories."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "974feb38-e091-4a1b-9eca-02f5311f8660",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬────────────────┬──────────┬─────────────┬───────┐\n",
      "│ (index) │  actor_login   │ stars_my │ stars_other │ ratio │\n",
      "├─────────┼────────────────┼──────────┼─────────────┼───────┤\n",
      "│    0    │  'frank-zsy'   │   '41'   │     '0'     │ 1.079 │\n",
      "│    1    │   'hx94113'    │   '25'   │     '1'     │ 0.641 │\n",
      "│    2    │   'daydate'    │   '22'   │     '2'     │ 0.55  │\n",
      "│    3    │ 'blindpirate'  │   '58'   │    '151'    │ 0.307 │\n",
      "│    4    │ 'lidongze0629' │   '33'   │    '74'     │ 0.295 │\n",
      "│    5    │    'wtfil'     │   '27'   │    '75'     │ 0.239 │\n",
      "│    6    │  'Tara-Fuki'   │   '8'    │     '1'     │ 0.205 │\n",
      "│    7    │   'RayProud'   │   '9'    │     '7'     │  0.2  │\n",
      "│    8    │   'Jrmy-rbr'   │   '9'    │     '8'     │ 0.196 │\n",
      "│    9    │   'hcl0908'    │   '7'    │     '1'     │ 0.179 │\n",
      "│   10    │   'chenDSEE'   │   '7'    │     '2'     │ 0.175 │\n",
      "│   11    │   'wzl12356'   │   '9'    │    '15'     │ 0.17  │\n",
      "│   12    │   'Sophie36'   │   '7'    │     '5'     │ 0.163 │\n",
      "│   13    │   'fireber'    │   '6'    │     '0'     │ 0.158 │\n",
      "│   14    │ 'oooooutsider' │   '6'    │     '0'     │ 0.158 │\n",
      "│   15    │  'akselsoft'   │   '6'    │     '1'     │ 0.154 │\n",
      "│   16    │    'dplrwj'    │   '6'    │     '2'     │ 0.15  │\n",
      "│   17    │  'dpsisodia'   │   '6'    │     '2'     │ 0.15  │\n",
      "│   18    │  'Wammy1995'   │   '6'    │     '6'     │ 0.136 │\n",
      "│   19    │  'steven-wan'  │   '6'    │     '7'     │ 0.133 │\n",
      "└─────────┴────────────────┴──────────┴─────────────┴───────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "WITH repo_name IN (\n",
    "    SELECT repo_name\n",
    "    FROM gh_events\n",
    "    WHERE type = 'WatchEvent' AND actor_login = 'frank-zsy'\n",
    ") AS is_my_repo\n",
    "SELECT actor_login, SUM(is_my_repo) AS stars_my, SUM(NOT is_my_repo) AS stars_other, ROUND(stars_my / (38 + stars_other), 3) AS ratio\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent'\n",
    "GROUP BY actor_login\n",
    "ORDER BY ratio DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "874f2385-3558-4f00-adec-65c81af8b935",
   "metadata": {},
   "source": [
    "Here is my friends by data... and I don't know what to do with this list."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cc799a8b-aacc-49eb-9ec1-f7cffc92e9ee",
   "metadata": {},
   "source": [
    "## Affinity by issues and PRs\n",
    "\n",
    "Authors that contributed to ClikcHouse also contributed to what repositories?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "43a23167-67af-4343-b7ca-5e09de398d5c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬───────────────────────────────────────────────────┬────────┬─────────┐\n",
      "│ (index) │                     repo_name                     │  prs   │ authors │\n",
      "├─────────┼───────────────────────────────────────────────────┼────────┼─────────┤\n",
      "│    0    │             'apache/incubator-doris'              │ '527'  │  '31'   │\n",
      "│    1    │                  'pingcap/tidb'                   │ '825'  │  '27'   │\n",
      "│    2    │                  'apache/spark'                   │ '160'  │  '26'   │\n",
      "│    3    │             'Homebrew/homebrew-core'              │  '65'  │  '25'   │\n",
      "│    4    │                  'apache/flink'                   │ '327'  │  '24'   │\n",
      "│    5    │             'yandex/clickhouse-jdbc'              │ '103'  │  '22'   │\n",
      "│    6    │                'facebook/rocksdb'                 │  '43'  │  '19'   │\n",
      "│    7    │               'StarRocks/starrocks'               │ '378'  │  '18'   │\n",
      "│    8    │                 'grafana/grafana'                 │ '342'  │  '18'   │\n",
      "│    9    │               'kubernetes/website'                │  '28'  │  '18'   │\n",
      "│   10    │              'kubernetes/kubernetes'              │  '59'  │  '17'   │\n",
      "│   11    │                'pocoproject/poco'                 │  '41'  │  '17'   │\n",
      "│   12    │          'Altinity/clickhouse-operator'           │ '525'  │  '17'   │\n",
      "│   13    │ 'rms-support-letter/rms-support-letter.github.io' │  '18'  │  '17'   │\n",
      "│   14    │                   'helm/charts'                   │ '569'  │  '16'   │\n",
      "│   15    │               'avelino/awesome-go'                │  '41'  │  '16'   │\n",
      "│   16    │                 'ansible/ansible'                 │  '49'  │  '16'   │\n",
      "│   17    │                  'NixOS/nixpkgs'                  │ '4314' │  '16'   │\n",
      "│   18    │                  'apache/doris'                   │ '455'  │  '14'   │\n",
      "│   19    │         'DefinitelyTyped/DefinitelyTyped'         │  '88'  │  '13'   │\n",
      "└─────────┴───────────────────────────────────────────────────┴────────┴─────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, COUNT() AS prs, uniq(actor_login) AS authors\n",
    "FROM gh_events\n",
    "WHERE type = 'PullRequestEvent' AND action = 'opened' AND actor_login IN\n",
    "(\n",
    "    SELECT actor_login\n",
    "    FROM gh_events\n",
    "    WHERE type = 'PullRequestEvent' AND action = 'opened' AND repo_name IN ('yandex/ClickHouse', 'ClickHouse/ClickHouse')\n",
    ") AND repo_name NOT LIKE '%ClickHouse%'\n",
    "GROUP BY repo_name\n",
    "ORDER BY authors DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1cb65355-295d-4f9f-8e40-2dbd02258073",
   "metadata": {},
   "source": [
    "Authors that filed an issue in ClickHouse also filed issues in what repositories?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "97f7fe1b-173c-49ff-8368-0de7220865d5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────────────────────────────────┬───────┬─────────┐\n",
      "│ (index) │            repo_name            │  prs  │ authors │\n",
      "├─────────┼─────────────────────────────────┼───────┼─────────┤\n",
      "│    0    │        'grafana/grafana'        │ '342' │  '120'  │\n",
      "│    1    │           'golang/go'           │ '318' │  '101'  │\n",
      "│    2    │ 'Altinity/clickhouse-operator'  │ '219' │  '82'   │\n",
      "│    3    │  'mymarilyn/clickhouse-driver'  │ '88'  │  '62'   │\n",
      "│    4    │ 'AlexAkulov/clickhouse-backup'  │ '160' │  '60'   │\n",
      "│    5    │     'elastic/elasticsearch'     │ '152' │  '59'   │\n",
      "│    6    │ 'Vertamedia/clickhouse-grafana' │ '118' │  '58'   │\n",
      "│    7    │     'kubernetes/kubernetes'     │ '150' │  '56'   │\n",
      "│    8    │        'ansible/ansible'        │ '87'  │  '51'   │\n",
      "│    9    │   'apache/incubator-superset'   │ '161' │  '51'   │\n",
      "│   10    │    'yandex/clickhouse-jdbc'     │ '79'  │  '50'   │\n",
      "│   11    │         'pingcap/tidb'          │ '787' │  '50'   │\n",
      "│   12    │    'apache/incubator-doris'     │ '241' │  '46'   │\n",
      "│   13    │        'apache/superset'        │ '71'  │  '46'   │\n",
      "│   14    │     'prometheus/prometheus'     │ '76'  │  '39'   │\n",
      "│   15    │          'minio/minio'          │ '60'  │  '38'   │\n",
      "│   16    │        'dbeaver/dbeaver'        │ '60'  │  '38'   │\n",
      "│   17    │       'microsoft/vscode'        │ '63'  │  '37'   │\n",
      "│   18    │        'prestodb/presto'        │ '120' │  '37'   │\n",
      "│   19    │       'metabase/metabase'       │ '112' │  '36'   │\n",
      "└─────────┴─────────────────────────────────┴───────┴─────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, COUNT() AS prs, uniq(actor_login) AS authors\n",
    "FROM gh_events\n",
    "WHERE type = 'IssuesEvent' AND action = 'opened' AND actor_login IN\n",
    "(\n",
    "    SELECT actor_login\n",
    "    FROM gh_events\n",
    "    WHERE type = 'IssuesEvent' AND action = 'opened' AND repo_name IN ('yandex/ClickHouse', 'ClickHouse/ClickHouse')\n",
    ") AND repo_name NOT LIKE '%ClickHouse%'\n",
    "GROUP BY repo_name\n",
    "ORDER BY authors DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ce4a7549-a2a4-4a8f-a4c0-a44009cc613c",
   "metadata": {},
   "source": [
    "## Repositories with the most stars over one day"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "5b4e350b-78be-4506-b895-0a5ac80b6605",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬───────────────────────────────────────┬──────────────┬─────────┐\n",
      "│ (index) │               repo_name               │     day      │  stars  │\n",
      "├─────────┼───────────────────────────────────────┼──────────────┼─────────┤\n",
      "│    0    │           '996icu/996.ICU'            │ '2019-03-29' │ '31429' │\n",
      "│    1    │          'UsergeTeam/Userge'          │ '2022-01-02' │ '18943' │\n",
      "│    2    │     'UsergeTeam/Userge-Assistant'     │ '2022-01-02' │ '18872' │\n",
      "│    3    │           'M4cs/BabySploit'           │ '2019-09-08' │ '17707' │\n",
      "│    4    │         'microsoft/Terminal'          │ '2019-05-07' │ '12779' │\n",
      "│    5    │      'flightlessmango/MangoHud'       │ '2021-07-16' │ '9790'  │\n",
      "│    6    │             'apple/swift'             │ '2015-12-04' │ '9318'  │\n",
      "│    7    │        'TheBreakery/Bloomware'        │ '2022-02-07' │ '7667'  │\n",
      "│    8    │        'ant-design/ant-design'        │ '2021-05-16' │ '7552'  │\n",
      "│    9    │           'desktop/desktop'           │ '2020-11-16' │ '7070'  │\n",
      "│   10    │ 'WeNeedHome/SummaryOfLoanSuspension'  │ '2022-07-14' │ '6991'  │\n",
      "│   11    │         'mrpond/BlockTheSpot'         │ '2021-07-20' │ '6602'  │\n",
      "│   12    │          'amattson21/gitjob'          │ '2016-10-08' │ '6511'  │\n",
      "│   13    │            'httpie/httpie'            │ '2022-04-15' │ '6469'  │\n",
      "│   14    │ 'mr-mig/every-programmer-should-know' │ '2017-09-05' │ '6011'  │\n",
      "│   15    │    'jlevy/the-art-of-command-line'    │ '2015-06-16' │ '5598'  │\n",
      "│   16    │            'yarnpkg/yarn'             │ '2016-10-12' │ '5542'  │\n",
      "│   17    │      'DankMemer/webhook-server'       │ '2019-02-16' │ '5372'  │\n",
      "│   18    │   'NVIDIA/open-gpu-kernel-modules'    │ '2022-05-12' │ '5372'  │\n",
      "│   19    │          'Jarred-Sumner/bun'          │ '2022-07-06' │ '5036'  │\n",
      "└─────────┴───────────────────────────────────────┴──────────────┴─────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, toDate(created_at) AS day, COUNT() AS stars\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent'\n",
    "GROUP BY repo_name, day\n",
    "ORDER BY stars DESC\n",
    "LIMIT 1 BY repo_name\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e3384d5-9037-46cd-aaa1-ac010391cf80",
   "metadata": {},
   "source": [
    "## Repositories with the highest growth YoY"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "bdbba561-963c-4e2f-9fb9-a58a2e7fae43",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────────────────────────────────────────────────────┬───────────┬───────────┬───────┐\n",
      "│ (index) │                      repo_name                      │ stars2021 │ stars2020 │  yoy  │\n",
      "├─────────┼─────────────────────────────────────────────────────┼───────────┼───────────┼───────┤\n",
      "│    0    │                  'doocs/leetcode'                   │  '8366'   │  '1000'   │ 8.366 │\n",
      "│    1    │           'Developer-Y/cs-video-courses'            │  '10273'  │  '1881'   │ 5.461 │\n",
      "│    2    │                 'appwrite/appwrite'                 │  '10909'  │  '2106'   │ 5.18  │\n",
      "│    3    │                  'Ryujinx/Ryujinx'                  │  '7967'   │  '1720'   │ 4.632 │\n",
      "│    4    │                 'authelia/authelia'                 │  '8911'   │  '2048'   │ 4.351 │\n",
      "│    5    │             'ethereumbook/ethereumbook'             │  '4752'   │  '1111'   │ 4.277 │\n",
      "│    6    │                'freqtrade/freqtrade'                │  '11151'  │  '2683'   │ 4.156 │\n",
      "│    7    │        'OpenZeppelin/openzeppelin-contracts'        │  '5712'   │  '1382'   │ 4.133 │\n",
      "│    8    │       'rougier/scientific-visualization-book'       │  '4822'   │  '1220'   │ 3.952 │\n",
      "│    9    │             'signalapp/Signal-Desktop'              │  '5924'   │  '1614'   │ 3.67  │\n",
      "│   10    │             'signalapp/Signal-Android'              │  '8565'   │  '2339'   │ 3.662 │\n",
      "│   11    │                  'lbryio/lbry-sdk'                  │  '3698'   │  '1018'   │ 3.633 │\n",
      "│   12    │ 'tuteng/Best-websites-a-programmer-should-visit-zh' │  '4024'   │  '1108'   │ 3.632 │\n",
      "│   13    │               'signalapp/Signal-iOS'                │  '3933'   │  '1088'   │ 3.615 │\n",
      "│   14    │             'doocs/source-code-hunter'              │  '5841'   │  '1618'   │ 3.61  │\n",
      "│   15    │                  'pemistahl/grex'                   │  '3506'   │  '1016'   │ 3.451 │\n",
      "│   16    │            'AllThingsSmitty/css-protips'            │  '5135'   │  '1513'   │ 3.394 │\n",
      "│   17    │      'sudheerj/javascript-interview-questions'      │  '4825'   │  '1456'   │ 3.314 │\n",
      "│   18    │                 'ethereum/solidity'                 │  '5191'   │  '1593'   │ 3.259 │\n",
      "│   19    │           'Loyalsoldier/v2ray-rules-dat'            │  '5283'   │  '1629'   │ 3.243 │\n",
      "└─────────┴─────────────────────────────────────────────────────┴───────────┴───────────┴───────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "WITH toYear(created_at) AS year\n",
    "SELECT repo_name, SUM(year = 2021) AS stars2021, SUM(year = 2020) AS stars2020, ROUND(stars2021 / stars2020, 3) AS yoy\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent'\n",
    "GROUP BY repo_name\n",
    "HAVING MIN(created_at) <= '2020-01-01 00:00:00' AND stars2020 >= 1000\n",
    "ORDER BY yoy DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "35d674b8-3871-48d9-9a69-eb8e75ade657",
   "metadata": {},
   "source": [
    "A Chinese repository [doocs/leetcode](https://github.com/doocs/leetcode) has grown more than 8 times in stars in 2021!"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "682657d4-808a-480d-a551-5dd5fe0f12ab",
   "metadata": {},
   "source": [
    "## Repositories with the worst stagnation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "4cd5c564-7b92-4210-8146-29419fa04471",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────────────────────────────────────────┬───────────┬───────────┬───────┐\n",
      "│ (index) │                repo_name                │ stars2021 │ stars2020 │  yoy  │\n",
      "├─────────┼─────────────────────────────────────────┼───────────┼───────────┼───────┤\n",
      "│    0    │              'opencv/cvat'              │    '0'    │  '1242'   │   0   │\n",
      "│    1    │              'hapijs/joi'               │    '0'    │  '1410'   │   0   │\n",
      "│    2    │            'samdenty/gqless'            │    '0'    │  '2505'   │   0   │\n",
      "│    3    │          'shuleisanshi/myblog'          │    '9'    │  '1406'   │ 0.006 │\n",
      "│    4    │ 'mdbootstrap/bootstrap-material-design' │   '43'    │  '1737'   │ 0.025 │\n",
      "│    5    │          'yuanming-hu/taichi'           │   '114'   │  '4309'   │ 0.026 │\n",
      "│    6    │          'kbariotis/templates'          │   '54'    │  '1949'   │ 0.028 │\n",
      "│    7    │          'luruke/browser-2020'          │   '248'   │  '8166'   │ 0.03  │\n",
      "│    8    │         'WaykiChain/WaykiChain'         │   '41'    │  '1143'   │ 0.036 │\n",
      "│    9    │        'victorqribeiro/isocity'         │   '103'   │  '2501'   │ 0.041 │\n",
      "│   10    │    'microsoft/ApplicationInspector'     │   '177'   │  '3877'   │ 0.046 │\n",
      "│   11    │        'pattle/simpsons-in-css'         │   '75'    │  '1540'   │ 0.049 │\n",
      "│   12    │       'ritiek/spotify-downloader'       │   '77'    │  '1463'   │ 0.053 │\n",
      "│   13    │              'cdr/sshcode'              │   '76'    │  '1409'   │ 0.054 │\n",
      "│   14    │             'antfu/vueuse'              │   '150'   │  '2616'   │ 0.057 │\n",
      "│   15    │        'tomav/docker-mailserver'        │   '112'   │  '1753'   │ 0.064 │\n",
      "│   16    │        'Yours3lf/rpi-vk-driver'         │   '68'    │  '1067'   │ 0.064 │\n",
      "│   17    │           'twilco/kosmonaut'            │   '96'    │  '1475'   │ 0.065 │\n",
      "│   18    │        'NoEndToLF/ChinaMapView'         │   '75'    │  '1159'   │ 0.065 │\n",
      "│   19    │       'VGraupera/1on1-questions'        │   '543'   │  '8309'   │ 0.065 │\n",
      "└─────────┴─────────────────────────────────────────┴───────────┴───────────┴───────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "WITH toYear(created_at) AS year\n",
    "SELECT repo_name, SUM(year = 2021) AS stars2021, SUM(year = 2020) AS stars2020, ROUND(stars2021 / stars2020, 3) AS yoy\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent'\n",
    "GROUP BY repo_name\n",
    "HAVING MIN(created_at) <= '2020-01-01 00:00:00' AND MAX(created_at) >= '2021-06-01 00:00:00' AND stars2020 >= 1000\n",
    "ORDER BY yoy\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fff91455-6944-4c59-bdfa-089b376b61c4",
   "metadata": {},
   "source": [
    "## Repositories with the most steady growth over time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "044bafef-c9b8-4429-b0a3-28af38f2bf4e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────────────────────────────────────┬─────────────┬─────────────┬─────────┐\n",
      "│ (index) │              repo_name              │ daily_stars │ total_stars │  rate   │\n",
      "├─────────┼─────────────────────────────────────┼─────────────┼─────────────┼─────────┤\n",
      "│    0    │      'auth0/node-jsonwebtoken'      │    '18'     │   '16602'   │ 922.333 │\n",
      "│    1    │          'powerline/fonts'          │    '28'     │   '24756'   │ 884.143 │\n",
      "│    2    │            'fxsjy/jieba'            │    '34'     │   '29750'   │   875   │\n",
      "│    3    │ 'zsh-users/zsh-syntax-highlighting' │    '18'     │   '15665'   │ 870.278 │\n",
      "│    4    │         'cheeriojs/cheerio'         │    '29'     │   '23578'   │ 813.034 │\n",
      "│    5    │        'WordPress/WordPress'        │    '20'     │   '15414'   │  770.7  │\n",
      "│    6    │       'jaredhanson/passport'        │    '24'     │   '18286'   │ 761.917 │\n",
      "│    7    │       'VundleVim/Vundle.vim'        │    '25'     │   '18812'   │ 752.48  │\n",
      "│    8    │          'square/retrofit'          │    '56'     │   '41681'   │ 744.304 │\n",
      "│    9    │        'tornadoweb/tornado'         │    '21'     │   '15625'   │ 744.048 │\n",
      "│   10    │            'aws/aws-cli'            │    '16'     │   '11881'   │ 742.562 │\n",
      "│   11    │        'tpope/vim-surround'         │    '14'     │   '10379'   │ 741.357 │\n",
      "│   12    │          'pxb1988/dex2jar'          │    '15'     │   '11079'   │  738.6  │\n",
      "│   13    │         'mybatis/mybatis-3'         │    '27'     │   '19730'   │ 730.741 │\n",
      "│   14    │         'expressjs/multer'          │    '15'     │   '10851'   │  723.4  │\n",
      "│   15    │        'Modernizr/Modernizr'        │    '21'     │   '15028'   │ 715.619 │\n",
      "│   16    │      'coreybutler/nvm-windows'      │    '37'     │   '26125'   │ 706.081 │\n",
      "│   17    │ 'oblador/react-native-vector-icons' │    '25'     │   '17480'   │  699.2  │\n",
      "│   18    │        'Alamofire/Alamofire'        │    '54'     │   '37718'   │ 698.481 │\n",
      "│   19    │       'tymondesigns/jwt-auth'       │    '17'     │   '11859'   │ 697.588 │\n",
      "└─────────┴─────────────────────────────────────┴─────────────┴─────────────┴─────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, MAX(stars) AS daily_stars, SUM(stars) AS total_stars, ROUND(total_stars / daily_stars, 3) AS rate\n",
    "FROM (\n",
    "    SELECT repo_name, toDate(created_at) AS day, COUNT() AS stars\n",
    "    FROM gh_events\n",
    "    WHERE type = 'WatchEvent'\n",
    "    GROUP BY repo_name, day\n",
    ")\n",
    "GROUP BY repo_name\n",
    "ORDER BY rate DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b10eee27-bcd6-4fa6-9d9c-d66c722fc57b",
   "metadata": {},
   "source": [
    "## What is the best day of the week to catch a star?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "d763e2c4-1b65-41dd-b95d-0ef3141f8ccf",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────┬────────────┬──────────────┐\n",
      "│ (index) │ day │   stars    │     bar      │\n",
      "├─────────┼─────┼────────────┼──────────────┤\n",
      "│    0    │  1  │ '49089155' │ '█████████▋' │\n",
      "│    1    │  2  │ '50769320' │ '██████████' │\n",
      "│    2    │  3  │ '50067794' │ '██████████' │\n",
      "│    3    │  4  │ '49335589' │ '█████████▋' │\n",
      "│    4    │  5  │ '46594976' │ '█████████▎' │\n",
      "│    5    │  6  │ '33791462' │  '██████▋'   │\n",
      "│    6    │  7  │ '34519730' │  '██████▊'   │\n",
      "└─────────┴─────┴────────────┴──────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT toDayOfWeek(created_at) AS day, COUNT() AS stars, bar(stars, 0, 50000000, 10) AS bar\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent'\n",
    "GROUP BY day\n",
    "ORDER BY day\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fcf52446-1e83-467b-8299-1c7131c9e64f",
   "metadata": {},
   "source": [
    "It is Tuesday! Definitely not the weekend. Maybe Wednesday or Thursday, but not Monday or Friday."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "38e2ad66-775e-4850-bd82-5bbd835f44aa",
   "metadata": {},
   "source": [
    "## The total number of users on GitHub"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "be5c58e8-ccf6-4e5d-a42d-50880c14d991",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬────────────┐\n",
      "│ (index) │ user_count │\n",
      "├─────────┼────────────┤\n",
      "│    0    │ '52240194' │\n",
      "└─────────┴────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT uniq(actor_login) AS user_count FROM gh_events\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f7295851-628f-40ad-949e-9ac9ff80b508",
   "metadata": {},
   "source": [
    "52.2 million. Actually, these are users that are not only registered but also participated at least once in ... something.\n",
    "\n",
    "Total number of users that gave at least one star:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "db31a4ab-d2d4-4746-acb3-38a7d72730ef",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬────────────┐\n",
      "│ (index) │ user_count │\n",
      "├─────────┼────────────┤\n",
      "│    0    │ '15146658' │\n",
      "└─────────┴────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT uniq(actor_login) AS user_count\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent'\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d3a4facb-d3f4-4fb7-a6b8-7ae384243132",
   "metadata": {},
   "source": [
    "Just 15 million. I've heard that some people don't give stars. They just do their job instead.\n",
    "\n",
    "Total number of users with at least one push:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "d6957b1f-19ed-4fcd-8035-3106930b2f67",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬────────────┐\n",
      "│ (index) │ user_count │\n",
      "├─────────┼────────────┤\n",
      "│    0    │ '28521474' │\n",
      "└─────────┴────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT uniq(actor_login) AS user_count\n",
    "FROM gh_events\n",
    "WHERE type = 'PushEvent'\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b90816c0-2361-48e7-87e7-108b4d069b3d",
   "metadata": {},
   "source": [
    "There are actually more people who pushed code than those who gave stars.\n",
    "\n",
    "Total number of users with at least one created PR:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "61f51469-d067-42b8-8dae-fffbbf92492b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬────────────┐\n",
      "│ (index) │ user_count │\n",
      "├─────────┼────────────┤\n",
      "│    0    │ '9473912'  │\n",
      "└─────────┴────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT uniq(actor_login) AS user_count\n",
    "FROM gh_events\n",
    "WHERE type = 'PullRequestEvent' AND action = 'opened'\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "99ce2d6e-24b7-451b-a345-cf88ece8b5e9",
   "metadata": {},
   "source": [
    "## Stars from heavy GitHub users\n",
    "\n",
    "What if we count top starred repositories but only from those who made at least one PR in at least one repo?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "bfdafc75-b1e6-4ca3-9948-9e08adcfca80",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬──────────────────────────────────────────┬──────────┐\n",
      "│ (index) │                repo_name                 │  count   │\n",
      "├─────────┼──────────────────────────────────────────┼──────────┤\n",
      "│    0    │    'kamranahmedse/developer-roadmap'     │ '148296' │\n",
      "│    1    │          'sindresorhus/awesome'          │ '145620' │\n",
      "│    2    │             'facebook/react'             │ '145283' │\n",
      "│    3    │    'donnemartin/system-design-primer'    │ '142579' │\n",
      "│    4    │               'vuejs/vue'                │ '131573' │\n",
      "│    5    │  'jwasham/coding-interview-university'   │ '131529' │\n",
      "│    6    │        'getify/You-Dont-Know-JS'         │ '119915' │\n",
      "│    7    │         'tensorflow/tensorflow'          │ '112417' │\n",
      "│    8    │        'public-apis/public-apis'         │ '104734' │\n",
      "│    9    │     'trekhleb/javascript-algorithms'     │ '104199' │\n",
      "│   10    │ 'EbookFoundation/free-programming-books' │ '100352' │\n",
      "│   11    │    'danistefanovic/build-your-own-x'     │ '99590'  │\n",
      "│   12    │             '996icu/996.ICU'             │ '96479'  │\n",
      "│   13    │            'flutter/flutter'             │ '95065'  │\n",
      "│   14    │             'torvalds/linux'             │ '94218'  │\n",
      "│   15    │           'airbnb/javascript'            │ '92520'  │\n",
      "│   16    │       'FreeCodeCamp/FreeCodeCamp'        │ '92215'  │\n",
      "│   17    │            'github/gitignore'            │ '87363'  │\n",
      "│   18    │     'jlevy/the-art-of-command-line'      │ '83910'  │\n",
      "│   19    │       'freeCodeCamp/freeCodeCamp'        │ '82730'  │\n",
      "└─────────┴──────────────────────────────────────────┴──────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, COUNT() AS count\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent' AND actor_login IN (\n",
    "    SELECT actor_login\n",
    "    FROM gh_events\n",
    "    WHERE type = 'PullRequestEvent' AND action = 'opened'\n",
    ")\n",
    "GROUP BY repo_name\n",
    "ORDER BY count DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "20e163b1-fb4f-48d2-81c2-ee713f368484",
   "metadata": {},
   "source": [
    "The list is similar to the overall top list.\n",
    "\n",
    "What if we take authors who have made at least 10 PRs?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "8c04835b-4baf-40f4-b364-542e1b350efa",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬──────────────────────────────────────────┬─────────┐\n",
      "│ (index) │                repo_name                 │  count  │\n",
      "├─────────┼──────────────────────────────────────────┼─────────┤\n",
      "│    0    │             'facebook/react'             │ '67824' │\n",
      "│    1    │          'sindresorhus/awesome'          │ '65613' │\n",
      "│    2    │    'donnemartin/system-design-primer'    │ '64754' │\n",
      "│    3    │    'kamranahmedse/developer-roadmap'     │ '64510' │\n",
      "│    4    │        'getify/You-Dont-Know-JS'         │ '57877' │\n",
      "│    5    │               'vuejs/vue'                │ '55353' │\n",
      "│    6    │  'jwasham/coding-interview-university'   │ '53286' │\n",
      "│    7    │    'danistefanovic/build-your-own-x'     │ '48453' │\n",
      "│    8    │     'trekhleb/javascript-algorithms'     │ '47901' │\n",
      "│    9    │         'tensorflow/tensorflow'          │ '45899' │\n",
      "│   10    │        'public-apis/public-apis'         │ '45466' │\n",
      "│   11    │           'airbnb/javascript'            │ '45104' │\n",
      "│   12    │             'torvalds/linux'             │ '43178' │\n",
      "│   13    │            'flutter/flutter'             │ '40930' │\n",
      "│   14    │               'golang/go'                │ '40128' │\n",
      "│   15    │     'jlevy/the-art-of-command-line'      │ '39116' │\n",
      "│   16    │ 'EbookFoundation/free-programming-books' │ '38073' │\n",
      "│   17    │            'github/gitignore'            │ '37994' │\n",
      "│   18    │         'facebook/react-native'          │ '36267' │\n",
      "│   19    │        'resume/resume.github.com'        │ '35999' │\n",
      "└─────────┴──────────────────────────────────────────┴─────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, COUNT() AS count\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent' AND actor_login IN (\n",
    "    SELECT actor_login\n",
    "    FROM gh_events\n",
    "    WHERE type = 'PullRequestEvent' AND action = 'opened'\n",
    "    GROUP BY actor_login\n",
    "    HAVING COUNT() >= 10\n",
    ")\n",
    "GROUP BY repo_name\n",
    "ORDER BY count DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dc34212a-83ef-4d7c-a8cc-b1bd12eaae25",
   "metadata": {},
   "source": [
    "If we only count software, the list looks like this: React, Vue, Tensorflow, Linux, Flutter, Golang."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1272a32e-2bf3-46de-aa01-bbabbf43572a",
   "metadata": {},
   "source": [
    "## Repositories with the maximum amount of pull requests"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "0febd02f-970d-4c87-9d28-d879d4264cea",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬───────────────────────────────────────────┬──────────┬───────────────────┐\n",
      "│ (index) │                 repo_name                 │  count   │ uniq(actor_login) │\n",
      "├─────────┼───────────────────────────────────────────┼──────────┼───────────────────┤\n",
      "│    0    │     'google-test/signcla-probe-repo'      │ '443997' │        '5'        │\n",
      "│    1    │      'WolseyBankWitness/rediffusion'      │ '414593' │        '7'        │\n",
      "│    2    │   'mhutchinson/mhutchinson-distributor'   │ '253720' │        '6'        │\n",
      "│    3    │              'NixOS/nixpkgs'              │ '164047' │      '5892'       │\n",
      "│    4    │  'everypolitician/everypolitician-data'   │ '157464' │       '18'        │\n",
      "│    5    │       'actions-canary/ForkPRCanary'       │ '120726' │        '5'        │\n",
      "│    6    │    'google-test/signclav2-probe-repo'     │ '120396' │        '3'        │\n",
      "│    7    │         'Homebrew/homebrew-core'          │ '107819' │      '7579'       │\n",
      "│    8    │     'brianchandotcom/liferay-portal'      │ '99814'  │       '424'       │\n",
      "│    9    │             'elastic/kibana'              │ '89457'  │      '1146'       │\n",
      "│   10    │         'Homebrew/homebrew-cask'          │ '83524'  │      '5193'       │\n",
      "│   11    │          'microsoft/winget-pkgs'          │ '79846'  │      '2359'       │\n",
      "│   12    │ 'SmartThingsCommunity/SmartThingsPublic'  │ '75792'  │       '785'       │\n",
      "│   13    │ 'test-organization-kkjeer/bot-validation' │ '75212'  │        '5'        │\n",
      "│   14    │    'test-organization-kkjeer/app-test'    │ '74944'  │        '8'        │\n",
      "│   15    │                'odoo/odoo'                │ '74511'  │      '2580'       │\n",
      "│   16    │         'JuliaRegistries/General'         │ '70158'  │       '327'       │\n",
      "│   17    │          'kubernetes/kubernetes'          │ '61953'  │      '5278'       │\n",
      "│   18    │          'saby/wasaby-controls'           │ '58405'  │       '61'        │\n",
      "│   19    │             'pytorch/pytorch'             │ '56995'  │      '3561'       │\n",
      "└─────────┴───────────────────────────────────────────┴──────────┴───────────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, COUNT() AS count, uniq(actor_login)\n",
    "FROM gh_events\n",
    "WHERE type = 'PullRequestEvent' AND action = 'opened'\n",
    "GROUP BY repo_name\n",
    "ORDER BY count DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3ce8cbe7-dab7-4293-aef7-15d87eb7e490",
   "metadata": {},
   "source": [
    "Here we can see some very specific data. The top repository looks like a test repository where you can check signing a CLA. But there are only 5 users with PRs and they are obviously bots.\n",
    "\n",
    "Conclusion: if there are many pull requests from a small number of users, it means that this is just a part of some automated process.\n",
    "\n",
    "No. 4 is the package repository for Nix OS. It's quite understandable — if you want your package to be in the OS, just make a pull request. And there are a lot of packages. The same for No. 8 — Homebrew.\n",
    "\n",
    "Repositories with the maximum amount of pull request contributors:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "571deabf-06f2-45d9-adb1-fd1b3892e9c4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────────────────────────────────────────────────────────────────────────┬──────────┬─────────┐\n",
      "│ (index) │                                repo_name                                │  count   │    u    │\n",
      "├─────────┼─────────────────────────────────────────────────────────────────────────┼──────────┼─────────┤\n",
      "│    0    │                'firstcontributions/first-contributions'                 │ '50505'  │ '46345' │\n",
      "│    1    │                            'jlord/patchwork'                            │ '43375'  │ '37724' │\n",
      "│    2    │                  'google/it-cert-automation-practice'                   │ '24274'  │ '23303' │\n",
      "│    3    │                          'octocat/Spoon-Knife'                          │ '21925'  │ '19905' │\n",
      "│    4    │                    'DefinitelyTyped/DefinitelyTyped'                    │ '46376'  │ '17479' │\n",
      "│    5    │                 'zero-to-mastery/start-here-guidelines'                 │ '16198'  │ '14225' │\n",
      "│    6    │                            'JetBrains/swot'                             │ '14726'  │ '12431' │\n",
      "│    7    │                          'freddier/hyperblog'                           │ '12091'  │ '11750' │\n",
      "│    8    │                        'solana-labs/token-list'                         │ '26799'  │ '9966'  │\n",
      "│    9    │                       'archway-network/testnets'                        │ '10394'  │ '9689'  │\n",
      "│   10    │               'udacity/course-collaboration-travel-plans'               │  '9931'  │ '9585'  │\n",
      "│   11    │                       'MicrosoftDocs/azure-docs'                        │ '28432'  │ '9390'  │\n",
      "│   12    │                          'trustwallet/assets'                           │ '20646'  │ '8749'  │\n",
      "│   13    │                   'udacity/create-your-own-adventure'                   │ '10077'  │ '8556'  │\n",
      "│   14    │                        'deadlyvipers/dojo_rules'                        │ '13065'  │ '8204'  │\n",
      "│   15    │                     'AliceWonderland/hacktoberfest'                     │  '9479'  │ '7687'  │\n",
      "│   16    │                        'Homebrew/homebrew-core'                         │ '107819' │ '7579'  │\n",
      "│   17    │      'githubschool/open-enrollment-classes-introduction-to-github'      │  '9191'  │ '7437'  │\n",
      "│   18    │        'learn-co-students/js-from-dom-to-node-bootcamp-prep-000'        │  '7472'  │ '7420'  │\n",
      "│   19    │ 'learn-co-students/javascript-intro-to-functions-lab-bootcamp-prep-000' │  '7187'  │ '7157'  │\n",
      "└─────────┴─────────────────────────────────────────────────────────────────────────┴──────────┴─────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, COUNT() AS count, uniq(actor_login) AS u\n",
    "FROM gh_events\n",
    "WHERE type = 'PullRequestEvent' AND action = 'opened'\n",
    "GROUP BY repo_name\n",
    "ORDER BY u DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "18f265bc-6c04-49ed-a425-9f7d5e0abc08",
   "metadata": {},
   "source": [
    "Repository \"first-contribution\" is the obvious case: a repository that teaches you how to make a pull request... by allowing you to make a pull request to this repository. \"patchwork\" is similar. Most of the repositories in this list are similar."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8a64d34a-478c-401b-8872-42a41ffd92d4",
   "metadata": {},
   "source": [
    "## Repositories with the maxmium amount of issues."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "d840d5bb-2aa9-4293-be54-075d5094b038",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬────────────────────────────────────────┬───────────┬─────────┐\n",
      "│ (index) │                   n                    │     c     │    u    │\n",
      "├─────────┼────────────────────────────────────────┼───────────┼─────────┤\n",
      "│    0    │             'pddemo/demo'              │ '1192076' │  '11'   │\n",
      "│    1    │     'koorellasuresh/ukregiontest'      │ '379340'  │   '4'   │\n",
      "│    2    │  'planft/planft-marketplace-comments'  │ '178488'  │   '2'   │\n",
      "│    3    │         'lstjsuperman/fabric'          │ '161627'  │   '1'   │\n",
      "│    4    │           'microsoft/vscode'           │ '143417'  │ '63840' │\n",
      "│    5    │        'the-barserkou/comments'        │ '133124'  │   '2'   │\n",
      "│    6    │       'jlippold/tweakcompatible'       │ '126698'  │ '11260' │\n",
      "│    7    │             'nexity/testa'             │ '118867'  │   '1'   │\n",
      "│    8    │      'adguardteam/adguardfilters'      │ '118285'  │ '1038'  │\n",
      "│    9    │          'webcompat/web-bugs'          │ '109070'  │ '5962'  │\n",
      "│   10    │        'ramos-dev/jniwebshell'         │ '103174'  │   '1'   │\n",
      "│   11    │  'imamandrews/imamandrews.github.io'   │ '102892'  │   '3'   │\n",
      "│   12    │         'chrmarti/testissues'          │  '97102'  │  '20'   │\n",
      "│   13    │           'no-cqrt/googuns'            │  '86147'  │   '1'   │\n",
      "│   14    │           'ouyanxia2/hgmgmg'           │  '78293'  │  '52'   │\n",
      "│   15    │            'khan/khan-i18n'            │  '75761'  │   '1'   │\n",
      "│   16    │ 'debricked/debricked-test-integration' │  '73879'  │   '1'   │\n",
      "│   17    │           'flutter/flutter'            │  '73360'  │ '27182' │\n",
      "│   18    │       'microsoftdocs/azure-docs'       │  '66350'  │ '31133' │\n",
      "│   19    │          'leo424y/heysiri.ml'          │  '63471'  │   '1'   │\n",
      "└─────────┴────────────────────────────────────────┴───────────┴─────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT lower(repo_name) AS n, COUNT() AS c, uniq(actor_login) AS u\n",
    "FROM gh_events\n",
    "WHERE type = 'IssuesEvent' AND action = 'opened'\n",
    "GROUP BY n\n",
    "ORDER BY c DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4cb57a50-008a-4733-af63-c6a0cc8cd561",
   "metadata": {},
   "source": [
    "The first repository has a funny description: \"demo: A new issue is created in this repo every minute\". The 2nd repository no longer exists.\n",
    "\n",
    "The first meaningful result is VSCode with more than 143k issues and 63k authors. And the issues are real.\n",
    "\n",
    "Conclusion: if a repository has a high number of issues, maybe issues are created automatically.\n",
    "\n",
    "Let's add a cutoff at 1000 stars to distinguish the real issues from robot ones."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "847779c4-2e80-4d16-a413-01fbacfbb7b8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬──────────────────────────────┬──────────┬─────────┬──────────┐\n",
      "│ (index) │          repo_name           │    c     │    u    │  stars   │\n",
      "├─────────┼──────────────────────────────┼──────────┼─────────┼──────────┤\n",
      "│    0    │ 'AdguardTeam/AdguardFilters' │ '118285' │ '1038'  │  '2187'  │\n",
      "│    1    │      'microsoft/vscode'      │ '78388'  │ '40264' │ '77929'  │\n",
      "│    2    │      'flutter/flutter'       │ '73360'  │ '27182' │ '166097' │\n",
      "│    3    │  'MicrosoftDocs/azure-docs'  │ '66350'  │ '31133' │  '8643'  │\n",
      "│    4    │      'Microsoft/vscode'      │ '65029'  │ '27015' │ '81672'  │\n",
      "│    5    │   'ron190/jsql-injection'    │ '63344'  │  '46'   │  '1255'  │\n",
      "│    6    │       'elastic/kibana'       │ '45068'  │ '5125'  │ '16688'  │\n",
      "│    7    │   'cockroachdb/cockroach'    │ '43798'  │ '1455'  │ '25886'  │\n",
      "│    8    │         'golang/go'          │ '42495'  │ '13725' │ '118140' │\n",
      "│    9    │   'kubernetes/kubernetes'    │ '36290'  │ '10514' │ '93091'  │\n",
      "│   10    │     'godotengine/godot'      │ '35172'  │ '8754'  │ '57563'  │\n",
      "│   11    │   'tensorflow/tensorflow'    │ '35063'  │ '20067' │ '198006' │\n",
      "│   12    │       'rust-lang/rust'       │ '34209'  │ '8514'  │ '77984'  │\n",
      "│   13    │       'hq450/fancyss'        │ '31285'  │  '902'  │ '11066'  │\n",
      "│   14    │       'dotnet/roslyn'        │ '29485'  │ '3938'  │ '19161'  │\n",
      "│   15    │      'rancher/rancher'       │ '28271'  │ '6112'  │ '20362'  │\n",
      "│   16    │      'pytorch/pytorch'       │ '28027'  │ '10722' │ '66679'  │\n",
      "│   17    │      'ansible/ansible'       │ '25839'  │ '12785' │ '52909'  │\n",
      "│   18    │       'NixOS/nixpkgs'        │ '25710'  │ '5030'  │ '11604'  │\n",
      "│   19    │       'dart-lang/sdk'        │ '25300'  │ '4092'  │  '9907'  │\n",
      "└─────────┴──────────────────────────────┴──────────┴─────────┴──────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "WITH type = 'IssuesEvent' AND action = 'opened' AS issue_created\n",
    "SELECT repo_name, SUM(issue_created) AS c, uniqIf(actor_login, issue_created) AS u, SUM(type = 'WatchEvent') AS stars\n",
    "FROM gh_events\n",
    "WHERE type IN ('IssuesEvent', 'WatchEvent')\n",
    "GROUP BY repo_name\n",
    "HAVING stars >= 1000\n",
    "ORDER BY c DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c7b844e2-f378-4041-a79c-ba2ca8b77bfa",
   "metadata": {},
   "source": [
    "Now it looks like a reasonable list of the top repositories.\n",
    "\n",
    "And for the next report, let's sort by the number of issue authors:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "558e0cac-bc1c-4045-9194-03eb41bc9981",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬───────────────────────────────────────────────────────────────┬──────────┬─────────┬──────────┐\n",
      "│ (index) │                           repo_name                           │    c     │    u    │  stars   │\n",
      "├─────────┼───────────────────────────────────────────────────────────────┼──────────┼─────────┼──────────┤\n",
      "│    0    │                      'microsoft/vscode'                       │ '78388'  │ '40264' │ '77929'  │\n",
      "│    1    │                  'MicrosoftDocs/azure-docs'                   │ '66350'  │ '31133' │  '8643'  │\n",
      "│    2    │                       'flutter/flutter'                       │ '73360'  │ '27182' │ '166097' │\n",
      "│    3    │                      'Microsoft/vscode'                       │ '65029'  │ '27015' │ '81672'  │\n",
      "│    4    │                    'tensorflow/tensorflow'                    │ '35063'  │ '20067' │ '198006' │\n",
      "│    5    │                    'facebook/react-native'                    │ '22818'  │ '13912' │ '123403' │\n",
      "│    6    │                          'golang/go'                          │ '42495'  │ '13725' │ '118140' │\n",
      "│    7    │                       'ansible/ansible'                       │ '25839'  │ '12785' │ '52909'  │\n",
      "│    8    │                       'angular/angular'                       │ '24655'  │ '11979' │ '101432' │\n",
      "│    9    │                    'ant-design/ant-design'                    │ '23565'  │ '11979' │ '105223' │\n",
      "│   10    │                  'jlippold/tweakCompatible'                   │ '126698' │ '11260' │  '555'   │\n",
      "│   11    │                     'microsoft/PowerToys'                     │ '17649'  │ '11251' │ '90124'  │\n",
      "│   12    │                     'home-assistant/core'                     │ '20382'  │ '11249' │ '28678'  │\n",
      "│   13    │                       'docker/for-win'                        │ '12647'  │ '10869' │  '1925'  │\n",
      "│   14    │                       '996icu/996.ICU'                        │ '17308'  │ '10798' │ '273033' │\n",
      "│   15    │                       'pytorch/pytorch'                       │ '28027'  │ '10722' │ '66679'  │\n",
      "│   16    │ 'githubschool/open-enrollment-classes-introduction-to-github' │ '11979'  │ '10633' │  '921'   │\n",
      "│   17    │                       'grafana/grafana'                       │ '25069'  │ '10528' │ '52678'  │\n",
      "│   18    │                  'FortAwesome/Font-Awesome'                   │ '13249'  │ '10517' │ '52316'  │\n",
      "│   19    │                    'kubernetes/kubernetes'                    │ '36290'  │ '10514' │ '93091'  │\n",
      "└─────────┴───────────────────────────────────────────────────────────────┴──────────┴─────────┴──────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "WITH type = 'IssuesEvent' AND action = 'opened' AS issue_created\n",
    "SELECT repo_name, SUM(issue_created) AS c, uniqIf(actor_login, issue_created) AS u, SUM(type = 'WatchEvent') AS stars\n",
    "FROM gh_events\n",
    "WHERE type IN ('IssuesEvent', 'WatchEvent')\n",
    "GROUP BY repo_name\n",
    "ORDER BY u DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9be9ff4c-8b17-404d-b070-755834abb830",
   "metadata": {},
   "source": [
    "## Repositories with the most people who have push access"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c5b7b5a2-06aa-4086-95d4-ff035a8b8043",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬───────────────────────────────────────────────────────────────┬────────┬─────────┐\n",
      "│ (index) │                           repo_name                           │   u    │  stars  │\n",
      "├─────────┼───────────────────────────────────────────────────────────────┼────────┼─────────┤\n",
      "│    0    │ 'githubschool/open-enrollment-classes-introduction-to-github' │ '7850' │  '921'  │\n",
      "│    1    │             'githubschool/on-demand-github-pages'             │ '1100' │  '89'   │\n",
      "│    2    │                      'llvm/llvm-project'                      │ '840'  │ '7534'  │\n",
      "│    3    │                'HNGInternship/HNGInternship4'                 │ '518'  │  '44'   │\n",
      "│    4    │                  'bioconda/bioconda-recipes'                  │ '467'  │ '1356'  │\n",
      "│    5    │           'cs480-projects/cs480-projects.github.io'           │ '449'  │  '15'   │\n",
      "│    6    │                        'odoo-dev/odoo'                        │ '440'  │  '96'   │\n",
      "│    7    │                      'hnginterns/hngfun'                      │ '437'  │  '33'   │\n",
      "│    8    │                    'Automattic/wp-calypso'                    │ '434'  │ '13054' │\n",
      "│    9    │                 'tencentyun/qcloud-documents'                 │ '429'  │ '1071'  │\n",
      "│   10    │                    'HNGInternship/HNGFun'                     │ '419'  │  '21'   │\n",
      "│   11    │                         'mks65/list'                          │ '409'  │   '0'   │\n",
      "│   12    │                         'mks65/euler'                         │ '408'  │   '1'   │\n",
      "│   13    │                  'armory-training/spintroui'                  │ '390'  │   '4'   │\n",
      "│   14    │                         'mks66/line'                          │ '387'  │   '0'   │\n",
      "│   15    │                       'mks66/picmaker'                        │ '383'  │   '3'   │\n",
      "│   16    │                        'mks65/dirinfo'                        │ '382'  │   '0'   │\n",
      "│   17    │                        'mks66/matrix'                         │ '374'  │   '0'   │\n",
      "│   18    │                          'mks66/3d'                           │ '373'  │   '0'   │\n",
      "│   19    │                        'mks66/curves'                         │ '357'  │   '0'   │\n",
      "└─────────┴───────────────────────────────────────────────────────────────┴────────┴─────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, uniqIf(actor_login, type = 'PushEvent') AS u, SUM(type = 'WatchEvent') AS stars\n",
    "FROM gh_events\n",
    "WHERE type IN ('PushEvent', 'WatchEvent') AND toYear(created_at) <= 2020\n",
    "GROUP BY repo_name\n",
    "ORDER BY u DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "599ff1b9-7ab9-4918-9a2a-21e0e9a60871",
   "metadata": {},
   "source": [
    "The first one is educational. It's really fantastic to have almost 8 thousand people pushing to the repository. Maybe it's just a development model where they are giving access to separate branches for a user or organization?\n",
    "\n",
    "What about repositories with the most people who have push access to the main branch."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "d2807998-18aa-42bf-b6d1-5aae8946f2f6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬───────────────────────────────────────────────────────────────┬────────┬─────────┐\n",
      "│ (index) │                           repo_name                           │   u    │  stars  │\n",
      "├─────────┼───────────────────────────────────────────────────────────────┼────────┼─────────┤\n",
      "│    0    │ 'githubschool/open-enrollment-classes-introduction-to-github' │ '5599' │  '921'  │\n",
      "│    1    │                      'llvm/llvm-project'                      │ '838'  │ '7534'  │\n",
      "│    2    │             'githubschool/on-demand-github-pages'             │ '808'  │  '89'   │\n",
      "│    3    │                'HNGInternship/HNGInternship4'                 │ '517'  │  '44'   │\n",
      "│    4    │           'cs480-projects/cs480-projects.github.io'           │ '449'  │  '15'   │\n",
      "│    5    │                      'hnginterns/hngfun'                      │ '437'  │  '33'   │\n",
      "│    6    │                  'bioconda/bioconda-recipes'                  │ '432'  │ '1356'  │\n",
      "│    7    │                 'tencentyun/qcloud-documents'                 │ '426'  │ '1071'  │\n",
      "│    8    │                    'HNGInternship/HNGFun'                     │ '419'  │  '21'   │\n",
      "│    9    │                         'mks65/list'                          │ '409'  │   '0'   │\n",
      "│   10    │                         'mks65/euler'                         │ '408'  │   '1'   │\n",
      "│   11    │                         'mks66/line'                          │ '387'  │   '0'   │\n",
      "│   12    │                       'mks66/picmaker'                        │ '383'  │   '3'   │\n",
      "│   13    │                        'mks65/dirinfo'                        │ '382'  │   '0'   │\n",
      "│   14    │                    'Automattic/wp-calypso'                    │ '378'  │ '13054' │\n",
      "│   15    │                        'mks66/matrix'                         │ '374'  │   '0'   │\n",
      "│   16    │                          'mks66/3d'                           │ '373'  │   '0'   │\n",
      "│   17    │                        'mks66/curves'                         │ '357'  │   '0'   │\n",
      "│   18    │                       'mks66/polygons'                        │ '346'  │   '0'   │\n",
      "│   19    │                        'mks66/cstack'                         │ '343'  │   '0'   │\n",
      "└─────────┴───────────────────────────────────────────────────────────────┴────────┴─────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, uniqIf(actor_login, type = 'PushEvent' AND match(push_ref, '/(main|master)$')) AS u, SUM(type = 'WatchEvent') AS stars\n",
    "FROM gh_events\n",
    "WHERE type IN ('PushEvent', 'WatchEvent') AND toYear(created_at) <= 2020\n",
    "GROUP BY repo_name\n",
    "ORDER BY u DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4bb0e057-f053-4f34-8ee0-3726f65f4d0c",
   "metadata": {},
   "source": [
    "It's almost the same."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "83fb3a8a-4745-4662-ae24-10e1a78c6ddd",
   "metadata": {},
   "source": [
    "## Repositories with the maximum number of accepted invitations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "95d8acaa-7a14-4cbf-9a97-8d4efc2e8a86",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬───────────────────────────────────────────────────────────────┬─────────────┬─────────┐\n",
      "│ (index) │                           repo_name                           │ invitations │  stars  │\n",
      "├─────────┼───────────────────────────────────────────────────────────────┼─────────────┼─────────┤\n",
      "│    0    │ 'githubschool/open-enrollment-classes-introduction-to-github' │   '10309'   │  '921'  │\n",
      "│    1    │                  'openjournals/joss-reviews'                  │   '2626'    │  '638'  │\n",
      "│    2    │             'githubschool/on-demand-github-pages'             │   '1611'    │  '135'  │\n",
      "│    3    │                    'MasteringNuxt/NuxtBnB'                    │   '1554'    │  '229'  │\n",
      "│    4    │                         'zulip/zulip'                         │   '1158'    │ '18487' │\n",
      "│    5    │               'MasteringNuxt/mastering-nuxt-3'                │    '956'    │  '162'  │\n",
      "│    6    │            'InfiniteFlightAirportEditing/Airports'            │    '717'    │  '235'  │\n",
      "│    7    │                 'tencentyun/qcloud-documents'                 │    '455'    │ '2223'  │\n",
      "│    8    │                    'Automattic/wp-calypso'                    │    '437'    │ '13857' │\n",
      "│    9    │                  'zephyrproject-rtos/zephyr'                  │    '406'    │ '7479'  │\n",
      "│   10    │                      'llvm/llvm-project'                      │    '324'    │ '18020' │\n",
      "│   11    │                'leanprover-community/mathlib'                 │    '321'    │ '1378'  │\n",
      "│   12    │                   'w3c/web-platform-tests'                    │    '308'    │ '1251'  │\n",
      "│   13    │                       'dotnet/runtime'                        │    '295'    │ '11746' │\n",
      "│   14    │                'FightPandemics/FightPandemics'                │    '287'    │  '135'  │\n",
      "│   15    │                    'cockroachdb/cockroach'                    │    '284'    │ '25887' │\n",
      "│   16    │                         'oppia/oppia'                         │    '282'    │ '5687'  │\n",
      "│   17    │              'pqrs-org/KE-complex_modifications'              │    '278'    │ '1072'  │\n",
      "│   18    │                 'MicrosoftDocs/msteams-docs'                  │    '268'    │  '258'  │\n",
      "│   19    │                       'pytorch/pytorch'                       │    '253'    │ '66681' │\n",
      "└─────────┴───────────────────────────────────────────────────────────────┴─────────────┴─────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, SUM(type = 'MemberEvent') AS invitations, SUM(type = 'WatchEvent') AS stars\n",
    "FROM gh_events\n",
    "WHERE type IN ('MemberEvent', 'WatchEvent')\n",
    "GROUP BY repo_name\n",
    "HAVING stars >= 100\n",
    "ORDER BY invitations DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a6a9ff13-08bd-4b07-b84c-35a3a3ba465f",
   "metadata": {},
   "source": [
    "## Most forked repositories"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "d1026555-74ab-4fa9-ba7a-93844eabe61b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬───────────────────────────────────────────┬──────────┐\n",
      "│ (index) │                 repo_name                 │  forks   │\n",
      "├─────────┼───────────────────────────────────────────┼──────────┤\n",
      "│    0    │           'jtleek/datasharing'            │ '213462' │\n",
      "│    1    │           'octocat/Spoon-Knife'           │ '158491' │\n",
      "│    2    │      'rdpeng/ProgrammingAssignment2'      │ '134685' │\n",
      "│    3    │          'tensorflow/tensorflow'          │ '106605' │\n",
      "│    4    │            'github/gitignore'             │ '103723' │\n",
      "│    5    │           'LSPosed/MagiskOnWSA'           │ '96972'  │\n",
      "│    6    │ 'SmartThingsCommunity/SmartThingsPublic'  │ '93810'  │\n",
      "│    7    │             'twbs/bootstrap'              │ '87259'  │\n",
      "│    8    │      'nightscout/cgm-remote-monitor'      │ '83178'  │\n",
      "│    9    │ 'Pierian-Data/Complete-Python-3-Bootcamp' │ '79627'  │\n",
      "│   10    │          'barryclark/jekyll-now'          │ '77921'  │\n",
      "│   11    │ 'firstcontributions/first-contributions'  │ '64351'  │\n",
      "│   12    │   'jwasham/coding-interview-university'   │ '63375'  │\n",
      "│   13    │            'eugenp/tutorials'             │ '60745'  │\n",
      "│   14    │              'opencv/opencv'              │ '59147'  │\n",
      "│   15    │               'github/docs'               │ '58985'  │\n",
      "│   16    │             'facebook/react'              │ '57732'  │\n",
      "│   17    │            'tensorflow/models'            │ '55640'  │\n",
      "│   18    │             'jlord/patchwork'             │ '54083'  │\n",
      "│   19    │         'rdpeng/ExData_Plotting1'         │ '53851'  │\n",
      "└─────────┴───────────────────────────────────────────┴──────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, COUNT() AS forks\n",
    "FROM gh_events\n",
    "WHERE type = 'ForkEvent'\n",
    "GROUP BY repo_name\n",
    "ORDER BY forks DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bc96d455-fbbb-4f21-948f-c906bdd4b791",
   "metadata": {},
   "source": [
    "If we filter out repositories that have their main purpose to be forked, the clear winner is TensorFlow, then Bootstrap, OpenCV and React."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "95ac0dc1-137c-4543-a089-f09049b05d2a",
   "metadata": {},
   "source": [
    "## Proportions between stars and forks\n",
    "\n",
    "Let's check the proportion of stars and forks."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "1b3effab-33f3-42dc-bcb2-0edbcab06cb4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬───────────────────────────────────────────┬──────────┬──────────┬───────┐\n",
      "│ (index) │                 repo_name                 │  forks   │  stars   │ ratio │\n",
      "├─────────┼───────────────────────────────────────────┼──────────┼──────────┼───────┤\n",
      "│    0    │           'jtleek/datasharing'            │ '213462' │  '6308'  │ 0.03  │\n",
      "│    1    │           'octocat/Spoon-Knife'           │ '158491' │  '5262'  │ 0.033 │\n",
      "│    2    │      'rdpeng/ProgrammingAssignment2'      │ '134685' │  '1009'  │ 0.007 │\n",
      "│    3    │          'tensorflow/tensorflow'          │ '106605' │ '198015' │ 1.857 │\n",
      "│    4    │            'github/gitignore'             │ '103723' │ '132948' │ 1.282 │\n",
      "│    5    │           'LSPosed/MagiskOnWSA'           │ '96972'  │ '19957'  │ 0.206 │\n",
      "│    6    │ 'SmartThingsCommunity/SmartThingsPublic'  │ '93810'  │  '2980'  │ 0.032 │\n",
      "│    7    │             'twbs/bootstrap'              │ '87259'  │ '119637' │ 1.371 │\n",
      "│    8    │      'nightscout/cgm-remote-monitor'      │ '83178'  │  '2508'  │ 0.03  │\n",
      "│    9    │ 'Pierian-Data/Complete-Python-3-Bootcamp' │ '79627'  │ '25158'  │ 0.316 │\n",
      "│   10    │          'barryclark/jekyll-now'          │ '77921'  │  '8560'  │ 0.11  │\n",
      "│   11    │ 'firstcontributions/first-contributions'  │ '64351'  │ '31504'  │ 0.49  │\n",
      "│   12    │   'jwasham/coding-interview-university'   │ '63375'  │ '226865' │ 3.58  │\n",
      "│   13    │            'eugenp/tutorials'             │ '60745'  │ '35787'  │ 0.589 │\n",
      "│   14    │              'opencv/opencv'              │ '59147'  │ '61997'  │ 1.048 │\n",
      "│   15    │               'github/docs'               │ '58985'  │ '15779'  │ 0.268 │\n",
      "│   16    │             'facebook/react'              │ '57732'  │ '224442' │ 3.888 │\n",
      "│   17    │            'tensorflow/models'            │ '55640'  │ '84734'  │ 1.523 │\n",
      "│   18    │             'jlord/patchwork'             │ '54083'  │  '1420'  │ 0.026 │\n",
      "│   19    │         'rdpeng/ExData_Plotting1'         │ '53851'  │  '289'   │ 0.005 │\n",
      "└─────────┴───────────────────────────────────────────┴──────────┴──────────┴───────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, SUM(type = 'ForkEvent') AS forks, SUM(type = 'WatchEvent') AS stars, ROUND(stars/forks, 3) AS ratio\n",
    "FROM gh_events\n",
    "WHERE type IN ('ForkEvent', 'WatchEvent')\n",
    "GROUP BY repo_name\n",
    "ORDER BY forks DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "64f9877e-7e1d-49a2-85f9-b0dfbe899d01",
   "metadata": {},
   "source": [
    "We can see a separation. Some repositories are \"for forks\" like the \"octocat/Spoon-Knife\" — they either have fork as a purpose of the repo or some of them represent a template to base something new on. Some repositories are \"for stars\" — usually it's not software but some text content, like \"996icu/996.ICU\".\n",
    "\n",
    "The overall proportion between stars and forks:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a9351c83-7e18-426d-98e0-cd4eb455fb9d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────────────┬─────────────┬───────┐\n",
      "│ (index) │    forks    │    stars    │ ratio │\n",
      "├─────────┼─────────────┼─────────────┼───────┤\n",
      "│    0    │ '113012217' │ '314184812' │ 2.78  │\n",
      "└─────────┴─────────────┴─────────────┴───────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT SUM(type = 'ForkEvent') AS forks, SUM(type = 'WatchEvent') AS stars, ROUND(stars/forks, 2) AS ratio\n",
    "FROM gh_events\n",
    "WHERE type IN ('ForkEvent', 'WatchEvent')\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5408a03e-fdda-4eb9-836e-f70e1ee71217",
   "metadata": {},
   "source": [
    "And the result is higher for more popular reposioties:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "9947c2d7-6785-4921-af4c-67cf0b9a6bc7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬────────────┬─────────────┬───────┐\n",
      "│ (index) │   forks    │    stars    │ ratio │\n",
      "├─────────┼────────────┼─────────────┼───────┤\n",
      "│    0    │ '58425498' │ '228102208' │  3.9  │\n",
      "└─────────┴────────────┴─────────────┴───────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT SUM(forks) AS forks, SUM(stars) AS stars, ROUND(stars/forks, 2) AS ratio\n",
    "FROM (\n",
    "    SELECT SUM(type = 'ForkEvent') AS forks, SUM(type = 'WatchEvent') AS stars\n",
    "    FROM gh_events\n",
    "    WHERE type IN ('ForkEvent', 'WatchEvent')\n",
    "    GROUP BY repo_name\n",
    "    HAVING stars > 100\n",
    ")\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d6c0c3e5-a7e0-4977-91b9-f6a16023538c",
   "metadata": {},
   "source": [
    "## Issue with the most comments\n",
    "\n",
    "Total number of issue comments on GitHub:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "e48722e6-382a-45a1-a0c6-8ce3ef704f73",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────────────┐\n",
      "│ (index) │   count()   │\n",
      "├─────────┼─────────────┤\n",
      "│    0    │ '322930677' │\n",
      "└─────────┴─────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT COUNT()\n",
    "FROM gh_events\n",
    "WHERE type = 'IssueCommentEvent' AND action = 'created'\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2f2b1925-a517-4eaa-af31-a5c35ff46ccb",
   "metadata": {},
   "source": [
    "The top repositories by issue comments:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "5a95e227-c414-4eb2-b7a9-d7bcb865f2f3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬──────────────────────────────────┬───────────┐\n",
      "│ (index) │            repo_name             │  count()  │\n",
      "├─────────┼──────────────────────────────────┼───────────┤\n",
      "│    0    │     'kubernetes/kubernetes'      │ '1707150' │\n",
      "│    1    │          'apache/spark'          │ '788626'  │\n",
      "│    2    │         'rust-lang/rust'         │ '683432'  │\n",
      "│    3    │         'elastic/kibana'         │ '602998'  │\n",
      "│    4    │ 'google-test/signcla-probe-repo' │ '583011'  │\n",
      "│    5    │     'microsoft/winget-pkgs'      │ '554820'  │\n",
      "│    6    │          'cms-sw/cmssw'          │ '541578'  │\n",
      "│    7    │         'NixOS/nixpkgs'          │ '530175'  │\n",
      "│    8    │        'flutter/flutter'         │ '514855'  │\n",
      "│    9    │        'openshift/origin'        │ '506718'  │\n",
      "│   10    │       'openshift/release'        │ '438689'  │\n",
      "│   11    │ 'brianchandotcom/liferay-portal' │ '428312'  │\n",
      "│   12    │    'MicrosoftDocs/azure-docs'    │ '365503'  │\n",
      "│   13    │          'istio/istio'           │ '360877'  │\n",
      "│   14    │     'cockroachdb/cockroach'      │ '342266'  │\n",
      "│   15    │        'pytorch/pytorch'         │ '337423'  │\n",
      "│   16    │        'microsoft/vscode'        │ '322778'  │\n",
      "│   17    │     'tensorflow/tensorflow'      │ '322388'  │\n",
      "│   18    │          'nodejs/node'           │ '314191'  │\n",
      "│   19    │           'golang/go'            │ '303025'  │\n",
      "└─────────┴──────────────────────────────────┴───────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, COUNT()\n",
    "FROM gh_events\n",
    "WHERE type = 'IssueCommentEvent' AND action = 'created'\n",
    "GROUP BY repo_name\n",
    "ORDER BY COUNT() DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6171e20f-e99e-486e-8d08-f6e1ef99b622",
   "metadata": {},
   "source": [
    "The proportion between issue comments and issues:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "08547bea-a70b-4877-a45c-decaf62fa7bd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬──────────────────────────────────┬───────────┬──────────┬───────┐\n",
      "│ (index) │            repo_name             │ comments  │  issues  │ ratio │\n",
      "├─────────┼──────────────────────────────────┼───────────┼──────────┼───────┤\n",
      "│    0    │     'kubernetes/kubernetes'      │ '1707150' │ '102577' │ 16.64 │\n",
      "│    1    │          'apache/spark'          │ '788626'  │ '35018'  │ 22.52 │\n",
      "│    2    │         'rust-lang/rust'         │ '683432'  │ '83068'  │ 8.23  │\n",
      "│    3    │         'elastic/kibana'         │ '602998'  │ '132884' │ 4.54  │\n",
      "│    4    │ 'google-test/signcla-probe-repo' │ '583011'  │ '447312' │  1.3  │\n",
      "│    5    │     'microsoft/winget-pkgs'      │ '554820'  │ '88524'  │ 6.27  │\n",
      "│    6    │          'cms-sw/cmssw'          │ '541578'  │ '33245'  │ 16.29 │\n",
      "│    7    │         'NixOS/nixpkgs'          │ '530175'  │ '136636' │ 3.88  │\n",
      "│    8    │        'flutter/flutter'         │ '514855'  │ '102396' │ 5.03  │\n",
      "│    9    │        'openshift/origin'        │ '506718'  │ '26237'  │ 19.31 │\n",
      "│   10    │       'openshift/release'        │ '438689'  │ '34148'  │ 12.85 │\n",
      "│   11    │ 'brianchandotcom/liferay-portal' │ '428312'  │ '103420' │ 4.14  │\n",
      "│   12    │    'MicrosoftDocs/azure-docs'    │ '365503'  │ '99428'  │ 3.68  │\n",
      "│   13    │          'istio/istio'           │ '360877'  │ '37215'  │  9.7  │\n",
      "│   14    │     'cockroachdb/cockroach'      │ '342266'  │ '80691'  │ 4.24  │\n",
      "│   15    │        'pytorch/pytorch'         │ '337423'  │ '77070'  │ 4.38  │\n",
      "│   16    │        'microsoft/vscode'        │ '322778'  │ '83191'  │ 3.88  │\n",
      "│   17    │     'tensorflow/tensorflow'      │ '322388'  │ '49930'  │ 6.46  │\n",
      "│   18    │          'nodejs/node'           │ '314191'  │ '41421'  │ 7.59  │\n",
      "│   19    │           'golang/go'            │ '303025'  │ '46127'  │ 6.57  │\n",
      "└─────────┴──────────────────────────────────┴───────────┴──────────┴───────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, COUNT(action = 'created') AS comments, uniq(issue_number) AS issues, ROUND(comments/issues, 2) AS ratio\n",
    "FROM gh_events\n",
    "WHERE type = 'IssueCommentEvent'\n",
    "GROUP BY repo_name\n",
    "ORDER BY comments DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5c724ce3-8234-469d-bd5f-e876676b59a5",
   "metadata": {},
   "source": [
    "Kubernetes has the most active discussions among the top repositories. In contrast, the repository with the least comments per issue. And \"google-test/signcla-probe-repo\", is clearly not for discussions.\n",
    "\n",
    "Now let's find the most active issues..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "a43328da-32b5-4c62-8546-0622aad61eb5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬──────────────────────────────────────────────────────────┬──────────────┬──────────┐\n",
      "│ (index) │                        repo_name                         │ issue_number │ comments │\n",
      "├─────────┼──────────────────────────────────────────────────────────┼──────────────┼──────────┤\n",
      "│    0    │           'gafusion/regression_notifications'            │      1       │ '21888'  │\n",
      "│    1    │                   'sauron-demo/sauron'                   │      1       │ '21022'  │\n",
      "│    2    │             'odoo-mergebot-testing-org/repo'             │      1       │ '13153'  │\n",
      "│    3    │               'HarshCasper/Rotten-Scripts'               │      7       │ '11717'  │\n",
      "│    4    │                  'Blaquez-home/roslyn'                   │      2       │ '11071'  │\n",
      "│    5    │                   'keycloak/keycloak'                    │      60      │  '8397'  │\n",
      "│    6    │           'zeit-github-test/github-utils-test'           │      1       │  '8295'  │\n",
      "│    7    │             'odoo-mergebot-testing-org/proj'             │      1       │  '7507'  │\n",
      "│    8    │                    'jeremyjia/Games'                     │     743      │  '6774'  │\n",
      "│    9    │                    'Omicron666/godot'                    │      55      │  '6061'  │\n",
      "│   10    │                      'openshift/oc'                      │     270      │  '5909'  │\n",
      "│   11    │               'tphongio/elasticbox-plugin'               │      1       │  '5668'  │\n",
      "│   12    │           'openfoodfacts/openfoodfacts-server'           │     3767     │  '5098'  │\n",
      "│   13    │                    'codecov/ci-repo'                     │      4       │  '5026'  │\n",
      "│   14    │             'Blaquez-home/azure-sdk-for-net'             │      2       │  '4719'  │\n",
      "│   15    │                      'openshift/oc'                      │     814      │  '4706'  │\n",
      "│   16    │ 'openshift/cluster-resource-override-admission-operator' │      29      │  '4562'  │\n",
      "│   17    │                   'kubeflow/pipelines'                   │     5071     │  '4534'  │\n",
      "│   18    │             'odoo-mergebot-testing-org/proj'             │      2       │  '4175'  │\n",
      "│   19    │                 'ingvagabund/kubernetes'                 │      58      │  '4134'  │\n",
      "└─────────┴──────────────────────────────────────────────────────────┴──────────────┴──────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, issue_number, COUNT() AS comments\n",
    "FROM gh_events\n",
    "WHERE type = 'IssueCommentEvent' AND action = 'created'\n",
    "GROUP BY repo_name, issue_number\n",
    "ORDER BY comments DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c613dff2-fb77-41fd-8492-5fbdabb3faa8",
   "metadata": {},
   "source": [
    "The top repositories have the most comments in their first issue. It looks like technical comments made by some script. Nothing interesting here, and actually I did not find these comments on the GitHub website (maybe they have already been deleted)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5d897378-3a63-4313-af38-e445b9fb23c4",
   "metadata": {},
   "source": [
    "## Top commented issues for each of the top repositories"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "056449f1-7a96-4836-861d-df9d5b093e65",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬───────────────────────────────────────────────────────────┬───────────────┬─────────┬──────────────┬─────────────┐\n",
      "│ (index) │                            URL                            │ max(comments) │ authors │ issue_number │    stars    │\n",
      "├─────────┼───────────────────────────────────────────────────────────┼───────────────┼─────────┼──────────────┼─────────────┤\n",
      "│    0    │     'https://github.com/flutter/flutter/issues/51752'     │     '504'     │  '40'   │    51752     │ '507936858' │\n",
      "│    1    │  'https://github.com/kubernetes/kubernetes/issues/46254'  │    '1281'     │  '11'   │    46254     │ '343423766' │\n",
      "│    2    │   'https://github.com/tensorflow/tensorflow/issues/22'    │     '632'     │  '157'  │      22      │ '320388270' │\n",
      "│    3    │  'https://github.com/facebook/react-native/issues/4968'   │     '512'     │  '305'  │     4968     │ '275561132' │\n",
      "│    4    │     'https://github.com/rust-lang/rust/issues/65590'      │     '896'     │  '10'   │    65590     │ '195128478' │\n",
      "│    5    │        'https://github.com/golang/go/issues/15292'        │     '873'     │  '162'  │    15292     │ '138584085' │\n",
      "│    6    │     'https://github.com/angular/angular/issues/5689'      │     '307'     │  '83'   │     5689     │ '123248385' │\n",
      "│    7    │     'https://github.com/facebook/react/issues/13991'      │     '469'     │  '357'  │    13991     │ '116485398' │\n",
      "│    8    │       'https://github.com/nodejs/node/issues/5020'        │     '468'     │  '79'   │     5020     │ '109882344' │\n",
      "│    9    │     'https://github.com/Microsoft/vscode/issues/224'      │     '417'     │  '150'  │     224      │ '73668144'  │\n",
      "│   10    │     'https://github.com/microsoft/vscode/issues/8017'     │     '235'     │  '93'   │     8017     │ '71392124'  │\n",
      "│   11    │       'https://github.com/996icu/996.ICU/issues/20'       │    '1305'     │ '1038'  │      20      │ '52422720'  │\n",
      "│   12    │     'https://github.com/electron/electron/issues/673'     │     '234'     │  '61'   │     673      │ '48196275'  │\n",
      "│   13    │ 'https://github.com/FortAwesome/Font-Awesome/issues/7574' │     '408'     │  '328'  │     7574     │ '45671868'  │\n",
      "│   14    │    'https://github.com/godotengine/godot/issues/16863'    │     '513'     │  '89'   │    16863     │ '45362008'  │\n",
      "│   15    │        'https://github.com/atom/atom/issues/2956'         │     '238'     │  '95'   │     2956     │ '44277524'  │\n",
      "│   16    │     'https://github.com/bitcoin/bitcoin/issues/26525'     │     '188'     │  '59'   │    26525     │ '43689153'  │\n",
      "│   17    │        'https://github.com/vuejs/vue/issues/2873'         │     '214'     │  '63'   │     2873     │ '41932440'  │\n",
      "│   18    │  'https://github.com/ant-design/ant-design/issues/13848'  │     '913'     │  '536'  │    13848     │ '41669496'  │\n",
      "│   19    │      'https://github.com/pytorch/pytorch/issues/494'      │     '789'     │  '127'  │     494      │ '38341575'  │\n",
      "└─────────┴───────────────────────────────────────────────────────────┴───────────────┴─────────┴──────────────┴─────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT\n",
    "    CONCAT('https://github.com/', repo_name, '/issues/', toString(issue_number)) AS URL,\n",
    "    MAX(comments),\n",
    "    argMax(authors, comments) AS authors,\n",
    "    argMax(issue_number, comments) AS issue_number,\n",
    "    SUM(stars) AS stars\n",
    "FROM (\n",
    "    SELECT * FROM (\n",
    "        SELECT repo_name, issue_number, COUNT() AS comments, uniq(actor_login) AS authors\n",
    "        FROM gh_events\n",
    "        WHERE type = 'IssueCommentEvent' AND action = 'created'\n",
    "        GROUP BY repo_name, issue_number\n",
    "        HAVING authors >= 10\n",
    "    ) AS t1\n",
    "    INNER JOIN\n",
    "    (\n",
    "        SELECT repo_name, COUNT() AS stars\n",
    "        FROM gh_events\n",
    "        WHERE type = 'WatchEvent'\n",
    "        GROUP BY repo_name\n",
    "        HAVING stars > 10000\n",
    "    ) AS t2 USING (repo_name)\n",
    ")\n",
    "GROUP BY repo_name\n",
    "ORDER BY stars DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f52f7b76-1a0b-433c-88cf-4e5f67dd87ac",
   "metadata": {},
   "source": [
    "I hope you will find the most crucial discussions here. Enjoy!"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "82950cc1-fd68-4914-ad43-8993bc61397c",
   "metadata": {},
   "source": [
    "## Commits with the most comments\n",
    "\n",
    "It's rarely the case when a single commit has comments.\n",
    "\n",
    "Here are the top repositories by the number of commit comments:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "4809a14b-4e58-45e8-9d04-44d45d9c6acb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────────────────────────────────────┬──────────┬─────────┐\n",
      "│ (index) │              repo_name              │ comments │ authors │\n",
      "├─────────┼─────────────────────────────────────┼──────────┼─────────┤\n",
      "│    0    │     'bambootest-bot/githubtest'     │ '110701' │   '1'   │\n",
      "│    1    │          'NREL/EnergyPlus'          │ '91080'  │  '50'   │\n",
      "│    2    │  'iterativv/NostalgiaForInfinity'   │ '67088'  │  '15'   │\n",
      "│    3    │        'PaddlePaddle/Paddle'        │ '52679'  │  '50'   │\n",
      "│    4    │       'siggetest/githubtest'        │ '51350'  │   '1'   │\n",
      "│    5    │      'xamarin/xamarin-macios'       │ '50585'  │  '36'   │\n",
      "│    6    │       'w4ctech/front-end-rss'       │ '43978'  │   '1'   │\n",
      "│    7    │             'dcos/dcos'             │ '42592'  │  '16'   │\n",
      "│    8    │   'PipecraftNet/v2hot.github.io'    │ '33192'  │   '1'   │\n",
      "│    9    │          'sxadxsx/upptime'          │ '28534'  │   '1'   │\n",
      "│   10    │  'GuilhermeManteigas/DSC-website'   │ '27724'  │   '1'   │\n",
      "│   11    │ 'doourdo27/linux-command-autobuild' │ '24305'  │   '1'   │\n",
      "│   12    │       'kubernetes/kubernetes'       │ '21307'  │  '308'  │\n",
      "│   13    │      'wyattowalsh/wyattowalsh'      │ '18934'  │   '1'   │\n",
      "│   14    │      'joschi/asdf-vm-twitter'       │ '18585'  │   '3'   │\n",
      "│   15    │   'leetcode-pp/leetcode-pp-node'    │ '17892'  │   '1'   │\n",
      "│   16    │   'jupitersh/jupitersh.github.io'   │ '17552'  │   '2'   │\n",
      "│   17    │  'tgrzesik/express-simple-server'   │ '16339'  │   '2'   │\n",
      "│   18    │        'cypress-io/cypress'         │ '14698'  │  '51'   │\n",
      "│   19    │           'kwcckw/CogAlg'           │ '14093'  │   '5'   │\n",
      "└─────────┴─────────────────────────────────────┴──────────┴─────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, COUNT() AS comments, uniq(actor_login) AS authors\n",
    "FROM gh_events\n",
    "WHERE type = 'CommitCommentEvent'\n",
    "GROUP BY repo_name\n",
    "ORDER BY comments DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2c6636b3-de32-48b1-979b-aa650f0917d0",
   "metadata": {},
   "source": [
    "If there are many comments but a small number of comment authors, usually they are comments from the CI robot."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d986214f-686b-47d9-bdc1-b97a7478c64d",
   "metadata": {},
   "source": [
    "## The most tough code reviews"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "7006f438-c841-400b-b095-0ace59713120",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────────────────────────────────────────────────────────────┬─────────┐\n",
      "│ (index) │                             URL                             │ authors │\n",
      "├─────────┼─────────────────────────────────────────────────────────────┼─────────┤\n",
      "│    0    │        'https://github.com/torvalds/linux/pull/684'         │  '66'   │\n",
      "│    1    │           'https://github.com/NixOS/rfcs/pull/49'           │  '53'   │\n",
      "│    2    │         'https://github.com/sunpy/sunpy/pull/3391'          │  '52'   │\n",
      "│    3    │ 'https://github.com/dashbitco/mix_phx_gen_auth_demo/pull/1' │  '51'   │\n",
      "│    4    │          'https://github.com/reactjs/rfcs/pull/2'           │  '44'   │\n",
      "│    5    │          'https://github.com/php/php-rfcs/pull/1'           │  '40'   │\n",
      "│    6    │    'https://github.com/matrix-org/matrix-doc/pull/1772'     │  '40'   │\n",
      "│    7    │    'https://github.com/danielmiessler/SecLists/pull/155'    │  '38'   │\n",
      "│    8    │       'https://github.com/pingcap/docs-cn/pull/11115'       │  '37'   │\n",
      "│    9    │      'https://github.com/github/site-policy/pull/397'       │  '36'   │\n",
      "│   10    │       'https://github.com/pingcap/docs-cn/pull/11835'       │  '36'   │\n",
      "│   11    │       'https://github.com/symfony/symfony/pull/33553'       │  '35'   │\n",
      "│   12    │     'https://github.com/kubernetes/community/pull/306'      │  '34'   │\n",
      "│   13    │       'https://github.com/pingcap/docs-cn/pull/8061'        │  '34'   │\n",
      "│   14    │        'https://github.com/rust-lang/rfcs/pull/2850'        │  '33'   │\n",
      "│   15    │      'https://github.com/date-fns/date-fns/pull/1671'       │  '32'   │\n",
      "│   16    │       'https://github.com/NixOS/nixpkgs/pull/140136'        │  '32'   │\n",
      "│   17    │        'https://github.com/rust-lang/rfcs/pull/3090'        │  '32'   │\n",
      "│   18    │       'https://github.com/github/site-policy/pull/1'        │  '31'   │\n",
      "│   19    │       'https://github.com/pingcap/docs-cn/pull/12100'       │  '31'   │\n",
      "└─────────┴─────────────────────────────────────────────────────────────┴─────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT\n",
    "    concat('https://github.com/', repo_name, '/pull/', toString(issue_number)) AS URL,\n",
    "    uniq(actor_login) AS authors\n",
    "FROM gh_events\n",
    "WHERE type = 'PullRequestReviewCommentEvent' AND action = 'created'\n",
    "GROUP BY repo_name, issue_number\n",
    "ORDER BY authors DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d201ea79-2445-4661-8e60-46e0106e3884",
   "metadata": {},
   "source": [
    "The [first entry](https://github.com/torvalds/linux/pull/684) is true insanity. But there are many interesting ones like the [proposal](https://github.com/rust-lang/rfcs/pull/2850) to add inline assembly to Rust."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "14079f70-d574-4b60-a270-a4eaa73efaaf",
   "metadata": {},
   "source": [
    "## Authors with the most pushes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "85e5f9a3-8e84-45a6-abe8-1ae124094c0b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬───────────────────────────┬─────────────┬───────────┐\n",
      "│ (index) │        actor_login        │      c      │   repos   │\n",
      "├─────────┼───────────────────────────┼─────────────┼───────────┤\n",
      "│    0    │   'github-actions[bot]'   │ '130095995' │ '652062'  │\n",
      "│    1    │        'LombiqBot'        │ '65038500'  │   '150'   │\n",
      "│    2    │      'renovate[bot]'      │ '11979134'  │ '102683'  │\n",
      "│    3    │        'pull[bot]'        │ '11379261'  │ '229519'  │\n",
      "│    4    │      'renovate-bot'       │  '7917484'  │  '1655'   │\n",
      "│    5    │       'commit-b0t'        │  '6883218'  │    '3'    │\n",
      "│    6    │     'direwolf-github'     │  '6716780'  │ '3372396' │\n",
      "│    7    │     'dependabot[bot]'     │  '6678221'  │ '713852'  │\n",
      "│    8    │  'OpenLocalizationTest'   │  '4863831'  │   '713'   │\n",
      "│    9    │          'znyt'           │  '4579809'  │   '116'   │\n",
      "│   10    │     'breakingheatmap'     │  '3319741'  │    '1'    │\n",
      "│   11    │        'newstools'        │  '2837324'  │  '1029'   │\n",
      "│   12    │ 'dependabot-preview[bot]' │  '2779438'  │  '48081'  │\n",
      "│   13    │     'peter-clifford'      │  '2621392'  │    '4'    │\n",
      "│   14    │        'tmtmtmtm'         │  '2354100'  │  '1373'   │\n",
      "│   15    │        'labeneko'         │  '2314451'  │   '142'   │\n",
      "│   16    │       'ssbattousai'       │  '2307608'  │  '1025'   │\n",
      "│   17    │          'Dids'           │  '2276794'  │   '211'   │\n",
      "│   18    │         'himobi'          │  '2219796'  │    '1'    │\n",
      "│   19    │        'milesholt'        │  '2012184'  │    '5'    │\n",
      "└─────────┴───────────────────────────┴─────────────┴───────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT actor_login, COUNT() AS c, uniq(repo_name) AS repos\n",
    "FROM gh_events\n",
    "WHERE type = 'PushEvent'\n",
    "GROUP BY actor_login\n",
    "ORDER BY c DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a9bd8820-ddf9-4d71-a0de-89fbaec8c7bd",
   "metadata": {},
   "source": [
    "Obviously most of them are bots."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9592d02f-2b2b-4de9-b981-2083778e93e8",
   "metadata": {},
   "source": [
    "## Organizations by the number of stars"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "6dd8e2af-ff92-4db1-98f4-3dc803815c92",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬────────────────────┬───────────┐\n",
      "│ (index) │     org_login      │   stars   │\n",
      "├─────────┼────────────────────┼───────────┤\n",
      "│    0    │      'google'      │ '1747033' │\n",
      "│    1    │    'microsoft'     │ '1474724' │\n",
      "│    2    │     'facebook'     │ '1170031' │\n",
      "│    3    │      'apache'      │ '762542'  │\n",
      "│    4    │     'alibaba'      │ '761910'  │\n",
      "│    5    │    'Microsoft'     │ '680246'  │\n",
      "│    6    │      'vuejs'       │ '612062'  │\n",
      "│    7    │ 'aplus-framework'  │ '587433'  │\n",
      "│    8    │    'tensorflow'    │ '504241'  │\n",
      "│    9    │     'fossasia'     │ '499294'  │\n",
      "│   10    │ 'facebookresearch' │ '454961'  │\n",
      "│   11    │      'github'      │ '449520'  │\n",
      "│   12    │      'airbnb'      │ '421702'  │\n",
      "│   13    │     'Tencent'      │ '412832'  │\n",
      "│   14    │     'symfony'      │ '339887'  │\n",
      "│   15    │  'TheAlgorithms'   │ '326881'  │\n",
      "│   16    │      'dotnet'      │ '286694'  │\n",
      "│   17    │     'angular'      │ '285845'  │\n",
      "│   18    │      'square'      │ '267802'  │\n",
      "│   19    │    'kubernetes'    │ '258727'  │\n",
      "└─────────┴────────────────────┴───────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT org_login, COUNT() AS stars\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent' AND org_login != ''\n",
    "GROUP BY org_login\n",
    "ORDER BY stars DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e97535ce-fe7a-4017-8031-c98f1b06bf31",
   "metadata": {},
   "source": [
    "You may notice that Google is slightly ahead of Microsoft. Actually, it depends on how you count. Maybe you should sum up Tensorflow, Kubernetes, Flutter, Golang, and Chrome for Google; GitHub and DotNet for Microsoft; Facebook Research and React for Facebook."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e7bdaea5-ae4a-42c4-b517-507dc47103db",
   "metadata": {},
   "source": [
    "## Organizations by the number of repositories"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "368eecfb-cc7a-42a5-8e46-858e838373c4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────────────────────────────┬──────────┐\n",
      "│ (index) │          org_login          │  repos   │\n",
      "├─────────┼─────────────────────────────┼──────────┤\n",
      "│    0    │        'tf-vcs-e2e'         │ '457349' │\n",
      "│    1    │     'learn-co-students'     │ '329929' │\n",
      "│    2    │ 'circle-test-organization'  │ '295231' │\n",
      "│    3    │    'codeserver-test-org'    │ '141256' │\n",
      "│    4    │       'experiment50'        │ '99802'  │\n",
      "│    5    │         'blucodon'          │ '92336'  │\n",
      "│    6    │          'bluauto'          │ '74793'  │\n",
      "│    7    │        'aur-archive'        │ '70405'  │\n",
      "│    8    │        'turbocanary'        │ '68560'  │\n",
      "│    9    │         'GITenberg'         │ '67717'  │\n",
      "│   10    │        'aur-mirror'         │ '58144'  │\n",
      "│   11    │        'wp-plugins'         │ '52708'  │\n",
      "│   12    │     'terraformtesting'      │ '52121'  │\n",
      "│   13    │         'cb-kubecd'         │ '45141'  │\n",
      "│   14    │        'the-domains'        │ '42581'  │\n",
      "│   15    │  'textcreationpartnership'  │ '42199'  │\n",
      "│   16    │       'hail-ci-test'        │ '40397'  │\n",
      "│   17    │    'octokit-fixture-org'    │ '37265'  │\n",
      "│   18    │ 'odoo-mergebot-testing-org' │ '31422'  │\n",
      "│   19    │        'Sym123Blue'         │ '30299'  │\n",
      "└─────────┴─────────────────────────────┴──────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT org_login, uniq(repo_name) AS repos\n",
    "FROM gh_events\n",
    "WHERE org_login != ''\n",
    "GROUP BY org_login\n",
    "ORDER BY repos DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f8f88075-0130-49c2-8c49-e497598b8c30",
   "metadata": {},
   "source": [
    "## Organizations by the size of community\n",
    "\n",
    "The size of community that is visible on GitHub."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "b34370ee-93fc-4db1-b77b-ff5b7d9709ac",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬──────────────────────┬──────────┬────────────┬───────────────┬─────────────────┬────────────────┬──────────────┐\n",
      "│ (index) │      org_login       │ authors  │ pr_authors │ issue_authors │ comment_authors │ review_authors │ push_authors │\n",
      "├─────────┼──────────────────────┼──────────┼────────────┼───────────────┼─────────────────┼────────────────┼──────────────┤\n",
      "│    0    │     'microsoft'      │ '368976' │  '47042'   │   '222229'    │    '274980'     │    '16676'     │   '10359'    │\n",
      "│    1    │       'google'       │ '141120' │  '48930'   │    '65297'    │     '92079'     │     '8995'     │    '3898'    │\n",
      "│    2    │      'facebook'      │ '134475' │  '20860'   │    '55767'    │    '110875'     │     '5767'     │    '1065'    │\n",
      "│    3    │   'microsoftdocs'    │ '131512' │  '30003'   │    '87288'    │     '68946'     │     '2945'     │    '1778'    │\n",
      "│    4    │       'apache'       │ '101443' │  '44294'   │    '41693'    │     '74186'     │    '20675'     │    '2994'    │\n",
      "│    5    │       'docker'       │ '96178'  │   '7767'   │    '42996'    │     '73173'     │     '1939'     │    '289'     │\n",
      "│    6    │       'azure'        │ '89402'  │  '19706'   │    '52315'    │     '67969'     │     '9092'     │    '5146'    │\n",
      "│    7    │      'angular'       │ '76600'  │   '7951'   │    '33852'    │     '64917'     │     '2129'     │    '192'     │\n",
      "│    8    │       'dotnet'       │ '72443'  │  '10494'   │    '43656'    │     '54936'     │     '4369'     │    '1059'    │\n",
      "│    9    │        'aws'         │ '70443'  │  '10198'   │    '34976'    │     '57179'     │     '3871'     │    '1625'    │\n",
      "│   10    │     'tensorflow'     │ '67551'  │   '9556'   │    '33485'    │     '57196'     │     '3117'     │    '640'     │\n",
      "│   11    │     'hashicorp'      │ '62913'  │  '12661'   │    '31931'    │     '48390'     │     '3131'     │    '910'     │\n",
      "│   12    │     'kubernetes'     │ '61124'  │  '15624'   │    '29288'    │     '51007'     │     '7227'     │    '372'     │\n",
      "│   13    │      'flutter'       │ '58096'  │   '4487'   │    '29353'    │     '47910'     │     '1762'     │    '352'     │\n",
      "│   14    │      'alibaba'       │ '55529'  │   '6712'   │    '36166'    │     '38098'     │     '1357'     │    '1122'    │\n",
      "│   15    │      'elastic'       │ '47423'  │   '8300'   │    '23364'    │     '37855'     │     '2462'     │    '1104'    │\n",
      "│   16    │ 'firstcontributions' │ '47137'  │  '46528'   │     '381'     │     '3508'      │     '147'      │     '8'      │\n",
      "│   17    │       'vuejs'        │ '44986'  │   '9570'   │    '21533'    │     '33037'     │     '1390'     │     '96'     │\n",
      "│   18    │   'home-assistant'   │ '44149'  │   '8463'   │    '21261'    │     '37385'     │     '3379'     │    '152'     │\n",
      "│   19    │ 'learn-co-students'  │ '41475'  │  '41282'   │     '878'     │     '1799'      │     '180'      │    '684'     │\n",
      "└─────────┴──────────────────────┴──────────┴────────────┴───────────────┴─────────────────┴────────────────┴──────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT\n",
    "    lower(org_login) AS org_login,\n",
    "    uniq(actor_login) AS authors,\n",
    "    uniqIf(actor_login, type = 'PullRequestEvent') AS pr_authors,\n",
    "    uniqIf(actor_login, type = 'IssuesEvent') AS issue_authors,\n",
    "    uniqIf(actor_login, type = 'IssueCommentEvent') AS comment_authors,\n",
    "    uniqIf(actor_login, type = 'PullRequestReviewCommentEvent') AS review_authors,\n",
    "    uniqIf(actor_login, type = 'PushEvent') AS push_authors\n",
    "FROM gh_events\n",
    "WHERE type IN ('PullRequestEvent', 'IssuesEvent', 'IssueCommentEvent', 'PullRequestReviewCommentEvent', 'PushEvent') AND org_login != ''\n",
    "GROUP BY org_login\n",
    "ORDER BY authors DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ff0caac4-a424-4ea5-b3e9-5d6f5690e4a9",
   "metadata": {},
   "source": [
    "Microsoft wins in 4 out of 6 categories. Apache wins for the number of code reviewers (I thought they are using JIRA, but actually it's not always the case). Google wins for the number of PR authors.\n",
    "\n",
    "Please take it with a grain of salt. Not every team is using GitHub as their issue tracker or code review system. Linux and Postgres are using maillists. LLVM is using Bugzilla and Phabricator."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eca72d5a-1178-4d3e-9a8f-fa89acdd5401",
   "metadata": {},
   "source": [
    "## Repositories by amount of modified code\n",
    "\n",
    "I want to get the repositories with the most added and removed code over time. If I do it in a naive way, the multiple forks of cdn.js repository will be on top. By the way, cdn.js is the largest repository in GitHub by size in bytes (it contains all popular JavaScript libraries, the total size is 254GB). To get something interesting, I added a threshold for the number of diff size and also for the ratio of added and removed code (in actively developing codebases, the ratio should be close to one)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "70b6260c-8585-460a-9a66-644c3cf86910",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬──────────────────────────────────────────────┬──────────┬─────────┬────────────┬────────────┐\n",
      "│ (index) │                  repo_name                   │   prs    │ authors │    adds    │    dels    │\n",
      "├─────────┼──────────────────────────────────────────────┼──────────┼─────────┼────────────┼────────────┤\n",
      "│    0    │    'everypolitician/everypolitician-data'    │ '149895' │  '18'   │ '66497776' │ '70973322' │\n",
      "│    1    │       'brianchandotcom/liferay-portal'       │ '98607'  │  '422'  │ '31200693' │ '14021387' │\n",
      "│    2    │               'elastic/kibana'               │ '88704'  │ '1112'  │ '20883805' │ '10046409' │\n",
      "│    3    │ 'googleapis/google-api-java-client-services' │ '11915'  │  '29'   │ '16761639' │ '12495040' │\n",
      "│    4    │         'code-dot-org/code-dot-org'          │ '44641'  │  '160'  │ '19104377' │ '9303339'  │\n",
      "│    5    │    'AzureSDKAutomation/azure-sdk-for-go'     │ '34801'  │   '5'   │ '17465828' │ '10482499' │\n",
      "│    6    │               'dotnet/roslyn'                │ '32360'  │  '700'  │ '16669248' │ '7869868'  │\n",
      "│    7    │   'googleapis/discovery-artifact-manager'    │  '4849'  │  '23'   │ '12303207' │ '11996186' │\n",
      "│    8    │  'AzureSDKAutomation/azure-sdk-for-python'   │  '7855'  │  '10'   │ '15695947' │ '6471637'  │\n",
      "│    9    │         'Azure/azure-sdk-for-python'         │ '17137'  │  '613'  │ '15896190' │ '6234287'  │\n",
      "│   10    │   'AzureSDKAutomation/azure-sdk-for-java'    │  '8744'  │   '2'   │ '17001132' │ '2729919'  │\n",
      "│   11    │    'AzureSDKAutomation/azure-sdk-for-js'     │  '7105'  │   '4'   │ '13924004' │ '5680475'  │\n",
      "│   12    │          'Azure/azure-sdk-for-net'           │ '17955'  │ '1426'  │ '14354757' │ '5039042'  │\n",
      "│   13    │          'Azure/azure-sdk-for-java'          │ '19976'  │  '484'  │ '14807218' │ '3753662'  │\n",
      "│   14    │         'shuyangzhou/liferay-portal'         │  '7374'  │  '131'  │ '11806878' │ '6620929'  │\n",
      "│   15    │               'brain-tec/odoo'               │ '16497'  │  '32'   │ '12019840' │ '6361017'  │\n",
      "│   16    │           'Azure/azure-sdk-for-js'           │ '15182'  │  '357'  │ '11672700' │ '4828560'  │\n",
      "│   17    │    'AzureSDKAutomation/azure-sdk-for-net'    │  '6069'  │   '3'   │ '12442355' │ '3821118'  │\n",
      "│   18    │           'cockroachdb/cockroach'            │ '43590'  │  '715'  │ '9962998'  │ '5354800'  │\n",
      "│   19    │           'kubernetes/kubernetes'            │ '61004'  │ '5148'  │ '10143490' │ '5121620'  │\n",
      "└─────────┴──────────────────────────────────────────────┴──────────┴─────────┴────────────┴────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT\n",
    "    repo_name,\n",
    "    COUNT() AS prs,\n",
    "    uniq(actor_login) AS authors,\n",
    "    sum(pull_additions) AS adds,\n",
    "    sum(pull_deletions) AS dels\n",
    "FROM gh_events\n",
    "WHERE type = 'PullRequestEvent' AND action = 'opened' AND pull_additions < 10000 AND pull_deletions < 10000\n",
    "GROUP BY repo_name\n",
    "HAVING (adds / dels) < 10\n",
    "ORDER BY adds + dels DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ebd06c16-9b97-4454-a8cd-23feb7846ba4",
   "metadata": {},
   "source": [
    "## Repositories by the number of pushes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "13e34541-f6ed-424c-8c87-382ae918de24",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬───────────────────────────┬──────────┬─────────┐\n",
      "│ (index) │         repo_name         │  pushes  │ authors │\n",
      "├─────────┼───────────────────────────┼──────────┼─────────┤\n",
      "│    0    │     'CocoaPods/Specs'     │ '622261' │  '13'   │\n",
      "│    1    │        'odoo/odoo'        │ '431113' │  '98'   │\n",
      "│    2    │   'docker-library/docs'   │ '361358' │   '6'   │\n",
      "│    3    │     'pytorch/pytorch'     │ '326588' │  '413'  │\n",
      "│    4    │       'unifyai/ivy'       │ '222022' │  '70'   │\n",
      "│    5    │   'openstack/openstack'   │ '206950' │   '2'   │\n",
      "│    6    │      'NixOS/nixpkgs'      │ '200416' │  '244'  │\n",
      "│    7    │  'Automattic/wp-calypso'  │ '163226' │  '609'  │\n",
      "│    8    │    'chromium/chromium'    │ '153032' │   '4'   │\n",
      "│    9    │     'greatfire/wiki'      │ '139741' │   '4'   │\n",
      "│   10    │    'llvm/llvm-project'    │ '120274' │ '1371'  │\n",
      "│   11    │ 'Homebrew/homebrew-core'  │ '118072' │  '55'   │\n",
      "│   12    │ 'sourcegraph/sourcegraph' │ '114261' │  '217'  │\n",
      "│   13    │    'getsentry/sentry'     │ '109736' │  '188'  │\n",
      "│   14    │     'elastic/kibana'      │ '102545' │  '541'  │\n",
      "│   15    │    'edx/edx-platform'     │ '98905'  │  '309'  │\n",
      "│   16    │   'WordPress/gutenberg'   │ '95458'  │  '247'  │\n",
      "│   17    │  'cockroachdb/cockroach'  │ '95112'  │  '221'  │\n",
      "│   18    │  'elastic/elasticsearch'  │ '94004'  │  '339'  │\n",
      "│   19    │    'JetBrains/kotlin'     │ '92006'  │  '141'  │\n",
      "└─────────┴───────────────────────────┴──────────┴─────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT\n",
    "    repo_name,\n",
    "    COUNT() AS pushes,\n",
    "    uniq(actor_login) AS authors\n",
    "FROM gh_events\n",
    "WHERE (type = 'PushEvent') AND (repo_name IN\n",
    "(\n",
    "    SELECT repo_name\n",
    "    FROM gh_events\n",
    "    WHERE type = 'WatchEvent'\n",
    "    GROUP BY repo_name\n",
    "    ORDER BY COUNT() DESC\n",
    "    LIMIT 10000\n",
    "))\n",
    "GROUP BY repo_name\n",
    "ORDER BY pushes DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e105fa89-eae3-48d0-9754-8575b0749b72",
   "metadata": {},
   "source": [
    "## Authors with the most code reviews"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "3495ad7b-5dd5-4df7-b7fe-80f1c753d2ac",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬────────────────────────────┬──────────┬─────────┬─────────┬─────────────────────────────────────────────────────┐\n",
      "│ (index) │        actor_login         │  count   │  repos  │   prs   │                       comment                       │\n",
      "├─────────┼────────────────────────────┼──────────┼─────────┼─────────┼─────────────────────────────────────────────────────┤\n",
      "│    0    │       'houndci-bot'        │ '286616' │ '5877'  │ '78672' │            'Line is too long. [105/100]'            │\n",
      "│    1    │        'codacy-bot'        │ '215741' │ '2312'  │ '21564' │          '![Codacy](https://www.codacy.c'           │\n",
      "│    2    │         'houndci'          │ '96476'  │ '2607'  │ '24426' │               'unexpected token kEND'               │\n",
      "│    3    │        'hound[bot]'        │ '69446'  │ '1754'  │ '14181' │          \"'import' is only available in \"           │\n",
      "│    4    │ 'github-learning-lab[bot]' │ '68011'  │ '16125' │ '28995' │          '```suggestion The time is: {{ '           │\n",
      "│    5    │     'codeclimate[bot]'     │ '39046'  │ '1451'  │ '11850' │          'Surrounding space missing for '           │\n",
      "│    6    │       'foreign-sub'        │ '30204'  │   '3'   │  '196'  │          'Codacy found an issue: [Use of'           │\n",
      "│    7    │         'jreback'          │ '29867'  │  '35'   │ '6057'  │          'so some of the files are not i'           │\n",
      "│    8    │  'staging-muse-bot[bot]'   │ '29829'  │  '19'   │  '108'  │                  'comment ignored'                  │\n",
      "│    9    │         'seanlip'          │ '29205'  │  '18'   │ '2725'  │          \"These buttons don't really mat\"           │\n",
      "│   10    │      'CyrusNajmabadi'      │ '28442'  │  '56'   │ '3507'  │          \"Actually, 'No' was intentional\"           │\n",
      "│   11    │        'TOMARUMARU'        │ '28285'  │ '4240'  │ '9762'  │                     'こちらも'                      │\n",
      "│   12    │       'stephentoub'        │ '28156'  │  '69'   │ '6190'  │          'Rather than checking BypassPro'           │\n",
      "│   13    │          'i-date'          │ '24632'  │ '4102'  │ '6539'  │ '一つのproductは出品した一人のuserに所属する関係で' │\n",
      "│   14    │       'stickler-ci'        │ '24034'  │  '457'  │ '7791'  │          'Doc comment for parameter $res'           │\n",
      "│   15    │         'liggitt'          │ '23592'  │  '131'  │ '5467'  │          'deleting the service breaks th'           │\n",
      "│   16    │        'vkurennov'         │ '23237'  │  '666'  │ '3674'  │          'И почему опять возможность гол'           │\n",
      "│   17    │      'MartinHjelmare'      │ '22172'  │  '48'   │ '4054'  │          'You can make this into a guard'           │\n",
      "│   18    │      'shingoteshima'       │ '21259'  │ '3747'  │ '7006'  │     'コメントアウト不要であれば消しましょう。'      │\n",
      "│   19    │       'golangcibot'        │ '20980'  │  '885'  │ '8303'  │            'File is not `goimports`-ed'             │\n",
      "└─────────┴────────────────────────────┴──────────┴─────────┴─────────┴─────────────────────────────────────────────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT\n",
    "    actor_login,\n",
    "    COUNT() AS count,\n",
    "    uniq(repo_name) AS repos,\n",
    "    uniq(repo_name, issue_number) AS prs,\n",
    "    replaceRegexpAll(substringUTF8(anyHeavy(body), 1, 30), '[\\r\\n]', ' ') AS comment\n",
    "FROM gh_events\n",
    "WHERE type = 'PullRequestReviewCommentEvent' AND action = 'created' AND toYear(created_at) <= 2020\n",
    "GROUP BY actor_login\n",
    "ORDER BY count DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3dba1240-0f6f-44a3-83d2-f372417708c0",
   "metadata": {},
   "source": [
    "Most of the most active reviewers are robots that do style checking and static analysis. But there are real people: [Jeff Reback](https://github.com/jreback). You can also find teachers who review code from students."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "840562b3-9713-40a6-b965-6e2a7bf929de",
   "metadata": {},
   "source": [
    "## Top lables\n",
    "\n",
    "What are the most popular labels for issues and pull requests?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "39f02c9e-297c-4469-8301-35080eb14bc4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────────────────────┬────────────┐\n",
      "│ (index) │        label        │     c      │\n",
      "├─────────┼─────────────────────┼────────────┤\n",
      "│    0    │   'dependencies'    │ '39161021' │\n",
      "│    1    │        'bug'        │ '17862538' │\n",
      "│    2    │    'enhancement'    │ '16074173' │\n",
      "│    3    │     'question'      │ '4322742'  │\n",
      "│    4    │    'javascript'     │ '4201723'  │\n",
      "│    5    │     'approved'      │ '3667577'  │\n",
      "│    6    │    'help wanted'    │ '3152736'  │\n",
      "│    7    │       'lgtm'        │ '2863106'  │\n",
      "│    8    │     'cla: yes'      │ '2256855'  │\n",
      "│    9    │   'cncf-cla: yes'   │ '2243569'  │\n",
      "│   10    │    'greenkeeper'    │ '2209534'  │\n",
      "│   11    │      'status'       │ '2071749'  │\n",
      "│   12    │      'size/XS'      │ '1891552'  │\n",
      "│   13    │        'Bug'        │ '1779556'  │\n",
      "│   14    │      'feature'      │ '1748421'  │\n",
      "│   15    │   'documentation'   │ '1603380'  │\n",
      "│   16    │ 'good first issue'  │ '1536495'  │\n",
      "│   17    │      'size/L'       │ '1482261'  │\n",
      "│   18    │     'kind/bug'      │ '1311667'  │\n",
      "│   19    │ 'release-note-none' │ '1215742'  │\n",
      "└─────────┴─────────────────────┴────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT\n",
    "    label,\n",
    "    COUNT() AS c\n",
    "FROM gh_events\n",
    "ARRAY JOIN issue_labels.name AS label\n",
    "WHERE type IN ('IssuesEvent', 'PullRequestEvent', 'IssueCommentEvent') AND action IN ('created', 'opened', 'labeled')\n",
    "GROUP BY label\n",
    "ORDER BY c DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "85d86d20-bb16-4543-a20f-9b14b0afafff",
   "metadata": {},
   "source": [
    "There are more bugs than enhancements. Fortunately, only by a little. \"Javascript\" is the only programming-language related label at the top.\n",
    "\n",
    "The diversity of bugs and features is overwhelming:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "61877958-4943-46c6-bb1c-49f512a999af",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬────────────────────────────┬────────────┐\n",
      "│ (index) │           label            │     c      │\n",
      "├─────────┼────────────────────────────┼────────────┤\n",
      "│    0    │           'bug'            │ '17862538' │\n",
      "│    1    │           'Bug'            │ '1779556'  │\n",
      "│    2    │         'feature'          │ '1748421'  │\n",
      "│    3    │         'kind/bug'         │ '1311667'  │\n",
      "│    4    │    'bugzilla/valid-bug'    │  '775343'  │\n",
      "│    5    │     'feature request'      │  '673334'  │\n",
      "│    6    │       'kind/feature'       │  '657014'  │\n",
      "│    7    │        'type: bug'         │  '647673'  │\n",
      "│    8    │         'Feature'          │  '583649'  │\n",
      "│    9    │        'Type: Bug'         │  '409901'  │\n",
      "│   10    │     'feature-request'      │  '389593'  │\n",
      "│   11    │         'type:bug'         │  '302032'  │\n",
      "│   12    │  'bugzilla/severity-high'  │  '290834'  │\n",
      "│   13    │ 'bugzilla/severity-medium' │  '277575'  │\n",
      "│   14    │     'Feature Request'      │  '268235'  │\n",
      "│   15    │       'new feature'        │  '216290'  │\n",
      "│   16    │   'bugzilla/invalid-bug'   │  '213122'  │\n",
      "│   17    │         'type/bug'         │  '192226'  │\n",
      "│   18    │        '[Type] Bug'        │  '159564'  │\n",
      "│   19    │      'type: feature'       │  '143799'  │\n",
      "└─────────┴────────────────────────────┴────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT\n",
    "    label,\n",
    "    COUNT() AS c\n",
    "FROM gh_events\n",
    "ARRAY JOIN issue_labels.name AS label\n",
    "WHERE type IN ('IssuesEvent', 'PullRequestEvent', 'IssueCommentEvent') AND action IN ('created', 'opened', 'labeled') AND (label ILIKE '%bug%' OR label ILIKE '%feature%')\n",
    "GROUP BY label\n",
    "ORDER BY c DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "3920a35a-3577-420b-8124-883631db5e67",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬────────────┬───────────┬───────────────────┐\n",
      "│ (index) │    bugs    │ features  │       ratio       │\n",
      "├─────────┼────────────┼───────────┼───────────────────┤\n",
      "│    0    │ '28972336' │ '7546825' │ 3.839009914765481 │\n",
      "└─────────┴────────────┴───────────┴───────────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT\n",
    "    sum(label ILIKE '%bug%') AS bugs,\n",
    "    sum(label ILIKE '%feature%') AS features,\n",
    "    bugs / features AS ratio\n",
    "FROM gh_events\n",
    "ARRAY JOIN issue_labels.name AS label\n",
    "WHERE type IN ('IssuesEvent', 'PullRequestEvent', 'IssueCommentEvent') AND action IN ('created', 'opened', 'labeled') AND (label ILIKE '%bug%' OR label ILIKE '%feature%')\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dc8aace9-2308-4690-8fdc-696c414257fd",
   "metadata": {},
   "source": [
    "Every feature generates 3.84 bugs on average."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "694a112e-3bd4-4d57-b978-8b0e52d9b2d0",
   "metadata": {},
   "source": [
    "## The longest repository names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "a9870b6b-b305-4bd4-a01c-e097922fce5f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐\n",
      "│ (index) │ count() │                                                                   repo_name                                                                    │\n",
      "├─────────┼─────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤\n",
      "│    0    │   '1'   │ 'JonathanJonathanJonathanJonathanJonatha/JonathanJonathanJonathanJonathanJonathanJonathanJonathanJonathanJonathanJonathanJonathanJonathanJona' │\n",
      "│    1    │   '1'   │ 'WWWWWWWWWWWWWWWWWWWWWWWWWWWMWWWWWWWWWWW/WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW' │\n",
      "│    2    │   '1'   │ 'joooooooooooooooooooooooooooooooooooooj/jooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo' │\n",
      "│    3    │   '1'   │ 'ELECTRONICATOMATHEMATICORRELANGEOMITALD/data-image-png-base64-iVBORw0KGgoAAAANSUhEUgAAAhIAAAISCAYAAACZPSa-AAAgAElEQVR4nO3dW5bbOrJFUVrD-e-y68' │\n",
      "│    4    │   '7'   │ 'strackoverflowwwwwwwwwwwwwwwwwwwwwwwwww/maximum-repository-title-length-is-super-long-but-its-a-free-country-so-go-ahead-and-make-it-longggg' │\n",
      "│    5    │  '15'   │ 'fkdjfkdkfjskfjsldkfjvndkslakfjgkdlskfjg/fksfekgkslgkkdjfkdlskfjkfkdlslakdjfkekjlklfkjdkslkjfojksjdfaskdjfsalkdfj-laskfjls-kdajfoasjfpoawefjk' │\n",
      "│    6    │   '4'   │ 'joooooooooooooooooooooooooooooooooooooj/jooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooj' │\n",
      "│    7    │  '45'   │ 'uwuwuwuwuwuwuwuwuwuwuwuwuwuwuwuwuwuwuwu/uwuwuwuwuwuwuwuwuwuwuwuwuwuwuwuwuwuwuwuuwuwuwuwuwuwuwuwuwuwuwuwuwuwuwuwuwuwuwuuwuwuwuwuwuwuwuwuwuwuw' │\n",
      "│    8    │   '1'   │ 'UDtUf4aRyjv7nU3YTg056xCJw1ghAJYXgad7oB5/hJJRB7rpa3IXwX8HRsA1B4jCDmlZBY9fAzXZWNPyhrsXYG5kCeC4RPFqKQ4I9sAu1aNzX2G6wAkBjm8BjPfKjdubEqkmeAIkIwgu' │\n",
      "│    9    │   '1'   │ '1ABC2DEF3GHI4JKL5MNO6PQRS7TUV8WXYZ90RON/data-image-png-base64-iVBORw0KGgoAAAANSUhEUgAAAhIAAAISCAYAAACZPSa-AAAgAElEQVR4nO3dW5bbOrJFUVrD-e-y68' │\n",
      "│   10    │   '2'   │ 'GOOMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/GOOMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' │\n",
      "│   11    │   '5'   │ 'accounts-inheritance-finders-of-america/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' │\n",
      "│   12    │   '1'   │ 'dldadnasjndfsjafajnsdfadnfadfkoafasdklk/fjkdasifjasdiofasiodfasjdogasdgajsdpgasdpgasjkdgo-askdpgspkdgvjaspgpasjidpgjiajisdgpjioasdpigasgpjia' │\n",
      "│   13    │   '1'   │ 'PERIODICTABLEOFELEMENTSYNTHETICOMPOUNDS/data-image-png-base64-iVBORw0KGgoAAAANSUhEUgAAAhIAAAISCAYAAACZPSa-AAAgAElEQVR4nO3dW5bbOrJFUVrD-e-y68' │\n",
      "│   14    │   '1'   │ 'a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a/a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-' │\n",
      "│   15    │   '1'   │ 'git-git-git-git-git-git-git-git-git-git/git.git.git.git.git.git.git.git.git.git.git.git.git.git.git.git.git.git.git.git.git.git.git.git.git.' │\n",
      "│   16    │   '2'   │ 'xvideos-xnxx-pornhub-xhamster-jerkmate/chengren-chengrenshequ-chengrendizhi-chengrenwangzhan-chengrenpian-chengrenshipin-chengrenshipin-seq'  │\n",
      "│   17    │   '1'   │ 'ALPHANUMERICALDRONTELOGICALCHEMYSTERIOS/https-www.google.com-search-q-Maki-BOT-E2-80-94-Yesterday-at-11-3A32-PM-Role-name-changed-From-ne-1'  │\n",
      "│   18    │   '3'   │ 'biubiubiubiubiubiubiubiubiubiubiubiubiu/biubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiubiu'  │\n",
      "│   19    │   '1'   │ 'COMNETORGINFOBIZUSNAMEDOMAINSCIENCENTAG/https-www.google.com-search-q-Maki-BOT-E2-80-94-Yesterday-at-11-3A32-PM-Role-name-changed-From-ne-1'  │\n",
      "└─────────┴─────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT COUNT(), repo_name\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent'\n",
    "GROUP BY repo_name\n",
    "ORDER BY length(repo_name) DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1fb51796-46ee-4756-bb75-1a4f97f109f6",
   "metadata": {},
   "source": [
    "The most favorite of the insane is the \"132 e's\". Did you miss the [story](https://iliana.fyi/blog/e98e/)?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "68a179ce-ad6a-43a7-86fb-bb4f4d7feaa3",
   "metadata": {},
   "source": [
    "## The shortest repository names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "f80797c6-426c-4b35-8bb7-0c8b05e33fbc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬───────────┬─────────┐\n",
      "│ (index) │ repo_name │ count() │\n",
      "├─────────┼───────────┼─────────┤\n",
      "│    0    │   'f/f'   │  '11'   │\n",
      "│    1    │   'e/m'   │   '1'   │\n",
      "│    2    │   's/s'   │   '3'   │\n",
      "│    3    │   '2/2'   │   '3'   │\n",
      "│    4    │   '2/1'   │   '1'   │\n",
      "│    5    │  'Xe/h'   │   '7'   │\n",
      "│    6    │  '69/a'   │   '3'   │\n",
      "│    7    │  'as/a'   │  '343'  │\n",
      "│    8    │  '3x/n'   │   '2'   │\n",
      "│    9    │  'hf/q'   │   '5'   │\n",
      "│   10    │  '7f/h'   │   '2'   │\n",
      "│   11    │  'Xe/x'   │  '68'   │\n",
      "│   12    │  'i/AI'   │   '1'   │\n",
      "│   13    │  'f/pq'   │  '163'  │\n",
      "│   14    │  'mg/i'   │   '4'   │\n",
      "│   15    │  'tj/n'   │ '16671' │\n",
      "│   16    │  'cv/t'   │  '32'   │\n",
      "│   17    │  '9H/Z'   │   '1'   │\n",
      "│   18    │  'gc/e'   │   '1'   │\n",
      "│   19    │  '9H/F'   │   '2'   │\n",
      "└─────────┴───────────┴─────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, COUNT()\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent' AND repo_name LIKE '%_/_%'\n",
    "GROUP BY repo_name\n",
    "ORDER BY length(repo_name) ASC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a268556-5d84-48a6-b9b6-e0836da8fc53",
   "metadata": {},
   "source": [
    "I'm surprised that tj/n is a real thing. f/pq is also a real thing and also related to node.js. Maybe node.js developers are addicted to short names?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b6683f83-863d-4612-b99c-7379c68397cd",
   "metadata": {},
   "source": [
    "## Repositories with ClickHouse-realted comments"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "729a1a91-41af-4759-a40d-352b5621cfa9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬─────────────────────────────────────┬─────────┐\n",
      "│ (index) │              repo_name              │ count() │\n",
      "├─────────┼─────────────────────────────────────┼─────────┤\n",
      "│    0    │       'ClickHouse/ClickHouse'       │ '17878' │\n",
      "│    1    │         'yandex/ClickHouse'         │ '3405'  │\n",
      "│    2    │    'ClickHouse/clickhouse-jdbc'     │ '1049'  │\n",
      "│    3    │   'AlexAkulov/clickhouse-backup'    │  '990'  │\n",
      "│    4    │   'Altinity/clickhouse-operator'    │  '961'  │\n",
      "│    5    │         'airbytehq/airbyte'         │  '758'  │\n",
      "│    6    │     'ClickHouse/clickhouse-go'      │  '601'  │\n",
      "│    7    │          'PostHog/posthog'          │  '586'  │\n",
      "│    8    │         'ibis-project/ibis'         │  '569'  │\n",
      "│    9    │          'getsentry/snuba'          │  '419'  │\n",
      "│   10    │    'mymarilyn/clickhouse-driver'    │  '378'  │\n",
      "│   11    │   'Vertamedia/clickhouse-grafana'   │  '333'  │\n",
      "│   12    │       'datafuselabs/databend'       │  '319'  │\n",
      "│   13    │ 'housepower/ClickHouse-Native-JDBC' │  '317'  │\n",
      "│   14    │    'ClickHouse/clickhouse-odbc'     │  '313'  │\n",
      "│   15    │     'DataDog/integrations-core'     │  '299'  │\n",
      "│   16    │     'PostHog/charts-clickhouse'     │  '299'  │\n",
      "│   17    │         'erda-project/erda'         │  '294'  │\n",
      "│   18    │  'xzkostyan/clickhouse-sqlalchemy'  │  '211'  │\n",
      "│   19    │     'sentry-kubernetes/charts'      │  '210'  │\n",
      "└─────────┴─────────────────────────────────────┴─────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name, COUNT()\n",
    "FROM gh_events\n",
    "WHERE type = 'IssueCommentEvent' AND body ILIKE '%ClickHouse%'\n",
    "GROUP BY repo_name\n",
    "ORDER BY COUNT() DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "779e1901-71b1-46f2-a4bf-7d072b8adb30",
   "metadata": {},
   "source": [
    "The most popular is Sentry Snuba, then ClickHouse Kubernetes Operator, ClickHouse Grafana, then Python, Go, ODBC, JDBC drivers."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2270be94-9561-41a2-b46a-d011788b7b7f",
   "metadata": {},
   "source": [
    "## Most popular comments on GitHub"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "3103ec61-2333-4780-a170-c3a010ac4bf4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬──────────────────────┬──────────┐\n",
      "│ (index) │         body         │ count()  │\n",
      "├─────────┼──────────────────────┼──────────┤\n",
      "│    0    │ 'Superseded by #6.'  │ '848802' │\n",
      "│    1    │ 'Superseded by #7.'  │ '795429' │\n",
      "│    2    │ 'Superseded by #5.'  │ '723298' │\n",
      "│    3    │ 'Superseded by #9.'  │ '713050' │\n",
      "│    4    │ 'Superseded by #8.'  │ '704076' │\n",
      "│    5    │ 'Superseded by #4.'  │ '638744' │\n",
      "│    6    │ 'Superseded by #10.' │ '627573' │\n",
      "│    7    │ 'Superseded by #11.' │ '599726' │\n",
      "│    8    │ 'Superseded by #12.' │ '577443' │\n",
      "│    9    │      'Thanks!'       │ '560428' │\n",
      "│   10    │ 'Superseded by #16.' │ '535624' │\n",
      "│   11    │ 'Superseded by #17.' │ '535345' │\n",
      "│   12    │ 'Superseded by #21.' │ '529687' │\n",
      "│   13    │ 'Superseded by #13.' │ '529110' │\n",
      "│   14    │ 'Superseded by #20.' │ '526920' │\n",
      "│   15    │ 'Superseded by #18.' │ '523926' │\n",
      "│   16    │ 'Superseded by #14.' │ '518783' │\n",
      "│   17    │ 'Superseded by #19.' │ '517929' │\n",
      "│   18    │ 'Superseded by #15.' │ '514886' │\n",
      "│   19    │ 'Superseded by #3.'  │ '506982' │\n",
      "└─────────┴──────────────────────┴──────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT body, COUNT()\n",
    "FROM gh_events\n",
    "WHERE type = 'IssueCommentEvent' AND notEmpty(body) AND length(body) < 100\n",
    "GROUP BY body\n",
    "ORDER BY COUNT() DESC\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e020fa8d-43e4-4688-ad2d-900c6a9a23b4",
   "metadata": {},
   "source": [
    "The `Superseded by #..` are comments created by dependabot automatically."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "967a5445-ce2a-4c0e-b3ca-ae467fb5f53b",
   "metadata": {},
   "source": [
    "## GitHub roulette\n",
    "\n",
    "If we roll a dice and SELECT 20 ramdon repositories with proprtional to the number of stars, what will we get?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "85dd9cf7-d7de-40d0-adbd-38a3417bdbc4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "┌─────────┬───────────────────────────────────────┐\n",
      "│ (index) │               repo_name               │\n",
      "├─────────┼───────────────────────────────────────┤\n",
      "│    0    │           'typicode/hotel'            │\n",
      "│    1    │          'philipxjm/Steward'          │\n",
      "│    2    │          'Jay113355/NBTEdit'          │\n",
      "│    3    │         'atom/teletype-crdt'          │\n",
      "│    4    │        'RainwayApp/sachiel-ts'        │\n",
      "│    5    │         'typesense/typesense'         │\n",
      "│    6    │       'Snakehater/3DEnviroment'       │\n",
      "│    7    │            'zeit/next.js'             │\n",
      "│    8    │        'electronicarts/EASTL'         │\n",
      "│    9    │           'genn-team/genn'            │\n",
      "│   10    │ 'danielbeach/dataEngineeringTemplate' │\n",
      "│   11    │   'wrathkuiye/spring-cloud-gateway'   │\n",
      "│   12    │       'willthames/ansible-lint'       │\n",
      "│   13    │        'carla-simulator/carla'        │\n",
      "│   14    │        'devfullcycle/goexpert'        │\n",
      "│   15    │            'eleven-sh/cli'            │\n",
      "│   16    │             'jpr5/ngrep'              │\n",
      "│   17    │        'mpurland/ReactiveBind'        │\n",
      "│   18    │      'cursospython/CursosPython'      │\n",
      "│   19    │        'ryanoasis/nerd-fonts'         │\n",
      "└─────────┴───────────────────────────────────────┘\n"
     ]
    }
   ],
   "source": [
    "query(`\n",
    "SELECT repo_name\n",
    "FROM gh_events\n",
    "WHERE type = 'WatchEvent'\n",
    "ORDER BY RAND()\n",
    "LIMIT 20\n",
    "`).then(console.table);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "88aeab66-584f-4ae3-abf2-d4af74fb2ae2",
   "metadata": {},
   "source": [
    "This is the true \"face\" of GitHub. Run a few queries and you can estimate and taste the Octoverse this way."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "JavaScript (Node.js)",
   "language": "javascript",
   "name": "javascript"
  },
  "language_info": {
   "file_extension": ".js",
   "mimetype": "application/javascript",
   "name": "javascript",
   "version": "16.13.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
